mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 23:13:25 +00:00
[schema] Add support for bot users
(imported from commit 634a8211b41fd0040c95b51b96a88d3517fa8cf4)
This commit is contained in:
@@ -66,14 +66,20 @@ def log_event(event):
|
|||||||
log.write(simplejson.dumps(event) + '\n')
|
log.write(simplejson.dumps(event) + '\n')
|
||||||
|
|
||||||
def do_create_user(email, password, realm, full_name, short_name,
|
def do_create_user(email, password, realm, full_name, short_name,
|
||||||
active=True):
|
active=True, bot=False, bot_owner=None):
|
||||||
log_event({'type': 'user_created',
|
event = {'type': 'user_created',
|
||||||
'timestamp': time.time(),
|
'timestamp': time.time(),
|
||||||
'full_name': full_name,
|
'full_name': full_name,
|
||||||
'short_name': short_name,
|
'short_name': short_name,
|
||||||
'user': email,
|
'user': email,
|
||||||
'domain': realm.domain})
|
'domain': realm.domain,
|
||||||
user_profile = create_user(email, password, realm, full_name, short_name, active)
|
'bot': bot}
|
||||||
|
if bot:
|
||||||
|
event['bot_owner'] = bot_owner.email
|
||||||
|
log_event(event)
|
||||||
|
|
||||||
|
user_profile = create_user(email, password, realm, full_name, short_name,
|
||||||
|
active, bot, bot_owner)
|
||||||
|
|
||||||
notice = dict(event=dict(type="realm_user", op="add",
|
notice = dict(event=dict(type="realm_user", op="add",
|
||||||
person=dict(email=user_profile.email,
|
person=dict(email=user_profile.email,
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ def bulk_create_users(realms, users_raw):
|
|||||||
for (email, full_name, short_name, active) in users:
|
for (email, full_name, short_name, active) in users:
|
||||||
domain = email.split('@')[1]
|
domain = email.split('@')[1]
|
||||||
profile = create_user_profile(realms[domain], email,
|
profile = create_user_profile(realms[domain], email,
|
||||||
initial_password(email), active,
|
initial_password(email), active, False,
|
||||||
full_name, short_name)
|
full_name, short_name, None)
|
||||||
profiles_to_create.append(profile)
|
profiles_to_create.append(profile)
|
||||||
UserProfile.objects.bulk_create(profiles_to_create)
|
UserProfile.objects.bulk_create(profiles_to_create)
|
||||||
|
|
||||||
|
|||||||
@@ -15,25 +15,26 @@ import hashlib
|
|||||||
# Only use this for bulk_create -- for normal usage one should use
|
# Only use this for bulk_create -- for normal usage one should use
|
||||||
# create_user (below) which will also make the Subscription and
|
# create_user (below) which will also make the Subscription and
|
||||||
# Recipient objects
|
# Recipient objects
|
||||||
def create_user_profile(realm, email, password, active, full_name, short_name):
|
def create_user_profile(realm, email, password, active, bot, full_name, short_name, bot_owner):
|
||||||
now = timezone.now()
|
now = timezone.now()
|
||||||
email = UserManager.normalize_email(email)
|
email = UserManager.normalize_email(email)
|
||||||
user_profile = UserProfile(email=email, is_staff=False, is_active=active,
|
user_profile = UserProfile(email=email, is_staff=False, is_active=active,
|
||||||
full_name=full_name, short_name=short_name,
|
full_name=full_name, short_name=short_name,
|
||||||
last_login=now, date_joined=now, realm=realm,
|
last_login=now, date_joined=now, realm=realm,
|
||||||
pointer=-1)
|
pointer=-1, is_bot=bot, bot_owner=bot_owner)
|
||||||
|
|
||||||
if active:
|
if bot or not active:
|
||||||
user_profile.set_password(password)
|
|
||||||
else:
|
|
||||||
user_profile.set_unusable_password()
|
user_profile.set_unusable_password()
|
||||||
|
else:
|
||||||
|
user_profile.set_password(password)
|
||||||
|
|
||||||
user_profile.api_key = initial_api_key(email)
|
user_profile.api_key = initial_api_key(email)
|
||||||
return user_profile
|
return user_profile
|
||||||
|
|
||||||
def create_user(email, password, realm, full_name, short_name,
|
def create_user(email, password, realm, full_name, short_name,
|
||||||
active=True):
|
active=True, bot=False, bot_owner=None):
|
||||||
user_profile = create_user_profile(realm, email, password, active,
|
user_profile = create_user_profile(realm, email, password, active, bot,
|
||||||
full_name, short_name)
|
full_name, short_name, bot_owner)
|
||||||
user_profile.save()
|
user_profile.save()
|
||||||
recipient = Recipient.objects.create(type_id=user_profile.id,
|
recipient = Recipient.objects.create(type_id=user_profile.id,
|
||||||
type=Recipient.PERSONAL)
|
type=Recipient.PERSONAL)
|
||||||
|
|||||||
@@ -0,0 +1,160 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import datetime
|
||||||
|
from south.db import db
|
||||||
|
from south.v2 import SchemaMigration
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(SchemaMigration):
|
||||||
|
|
||||||
|
def forwards(self, orm):
|
||||||
|
# Adding field 'UserProfile.is_bot'
|
||||||
|
db.add_column(u'zephyr_userprofile', 'is_bot',
|
||||||
|
self.gf('django.db.models.fields.BooleanField')(default=False),
|
||||||
|
keep_default=True)
|
||||||
|
|
||||||
|
# Adding field 'UserProfile.bot_owner'
|
||||||
|
db.add_column(u'zephyr_userprofile', 'bot_owner',
|
||||||
|
self.gf('django.db.models.fields.related.ForeignKey')(to=orm['zephyr.UserProfile'], null=True, on_delete=models.SET_NULL),
|
||||||
|
keep_default=True)
|
||||||
|
|
||||||
|
|
||||||
|
def backwards(self, orm):
|
||||||
|
# Deleting field 'UserProfile.is_bot'
|
||||||
|
db.delete_column(u'zephyr_userprofile', 'is_bot')
|
||||||
|
|
||||||
|
# Deleting field 'UserProfile.bot_owner'
|
||||||
|
db.delete_column(u'zephyr_userprofile', 'bot_owner_id')
|
||||||
|
|
||||||
|
|
||||||
|
models = {
|
||||||
|
u'zephyr.client': {
|
||||||
|
'Meta': {'object_name': 'Client'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30', 'db_index': 'True'})
|
||||||
|
},
|
||||||
|
u'zephyr.defaultstream': {
|
||||||
|
'Meta': {'unique_together': "(('realm', 'stream'),)", 'object_name': 'DefaultStream'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'realm': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Realm']"}),
|
||||||
|
'stream': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Stream']"})
|
||||||
|
},
|
||||||
|
u'zephyr.huddle': {
|
||||||
|
'Meta': {'object_name': 'Huddle'},
|
||||||
|
'huddle_hash': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40', 'db_index': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||||
|
},
|
||||||
|
u'zephyr.message': {
|
||||||
|
'Meta': {'object_name': 'Message'},
|
||||||
|
'content': ('django.db.models.fields.TextField', [], {}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'pub_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||||
|
'recipient': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Recipient']"}),
|
||||||
|
'rendered_content': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||||
|
'rendered_content_version': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||||
|
'sender': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.UserProfile']"}),
|
||||||
|
'sending_client': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Client']"}),
|
||||||
|
'subject': ('django.db.models.fields.CharField', [], {'max_length': '60', 'db_index': 'True'})
|
||||||
|
},
|
||||||
|
u'zephyr.mituser': {
|
||||||
|
'Meta': {'object_name': 'MitUser'},
|
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'})
|
||||||
|
},
|
||||||
|
u'zephyr.preregistrationuser': {
|
||||||
|
'Meta': {'object_name': 'PreregistrationUser'},
|
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'invited_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||||
|
'referred_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.UserProfile']", 'null': 'True'}),
|
||||||
|
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'streams': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['zephyr.Stream']", 'null': 'True', 'symmetrical': 'False'})
|
||||||
|
},
|
||||||
|
u'zephyr.realm': {
|
||||||
|
'Meta': {'object_name': 'Realm'},
|
||||||
|
'domain': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40', 'db_index': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'restricted_to_domain': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
|
||||||
|
},
|
||||||
|
u'zephyr.recipient': {
|
||||||
|
'Meta': {'unique_together': "(('type', 'type_id'),)", 'object_name': 'Recipient'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'type': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True'}),
|
||||||
|
'type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'})
|
||||||
|
},
|
||||||
|
u'zephyr.stream': {
|
||||||
|
'Meta': {'unique_together': "(('name', 'realm'),)", 'object_name': 'Stream'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'invite_only': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'db_index': 'True'}),
|
||||||
|
'realm': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Realm']"})
|
||||||
|
},
|
||||||
|
u'zephyr.streamcolor': {
|
||||||
|
'Meta': {'object_name': 'StreamColor'},
|
||||||
|
'color': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'subscription': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Subscription']"})
|
||||||
|
},
|
||||||
|
u'zephyr.subscription': {
|
||||||
|
'Meta': {'unique_together': "(('user_profile', 'recipient'),)", 'object_name': 'Subscription'},
|
||||||
|
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'color': ('django.db.models.fields.CharField', [], {'default': "'#c2c2c2'", 'max_length': '10'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'in_home_view': ('django.db.models.fields.NullBooleanField', [], {'default': 'True', 'null': 'True', 'blank': 'True'}),
|
||||||
|
'notifications': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'recipient': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Recipient']"}),
|
||||||
|
'user_profile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.UserProfile']"})
|
||||||
|
},
|
||||||
|
u'zephyr.useractivity': {
|
||||||
|
'Meta': {'unique_together': "(('user_profile', 'client', 'query'),)", 'object_name': 'UserActivity'},
|
||||||
|
'client': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Client']"}),
|
||||||
|
'count': ('django.db.models.fields.IntegerField', [], {}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'last_visit': ('django.db.models.fields.DateTimeField', [], {}),
|
||||||
|
'query': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
|
||||||
|
'user_profile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.UserProfile']"})
|
||||||
|
},
|
||||||
|
u'zephyr.usermessage': {
|
||||||
|
'Meta': {'unique_together': "(('user_profile', 'message'),)", 'object_name': 'UserMessage'},
|
||||||
|
'archived': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'flags': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'message': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Message']"}),
|
||||||
|
'user_profile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.UserProfile']"})
|
||||||
|
},
|
||||||
|
u'zephyr.userpresence': {
|
||||||
|
'Meta': {'unique_together': "(('user_profile', 'client'),)", 'object_name': 'UserPresence'},
|
||||||
|
'client': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Client']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'status': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '1'}),
|
||||||
|
'timestamp': ('django.db.models.fields.DateTimeField', [], {}),
|
||||||
|
'user_profile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.UserProfile']"})
|
||||||
|
},
|
||||||
|
u'zephyr.userprofile': {
|
||||||
|
'Meta': {'object_name': 'UserProfile'},
|
||||||
|
'api_key': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
|
||||||
|
'bot_owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.UserProfile']", 'null': 'True', 'on_delete': 'models.SET_NULL'}),
|
||||||
|
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'db_index': 'True'}),
|
||||||
|
'enable_desktop_notifications': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'enable_offline_email_notifications': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'enable_sounds': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'enter_sends': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}),
|
||||||
|
'full_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'is_bot': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||||
|
'last_pointer_updater': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
|
||||||
|
'last_reminder': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||||
|
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||||
|
'pointer': ('django.db.models.fields.IntegerField', [], {}),
|
||||||
|
'realm': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['zephyr.Realm']"}),
|
||||||
|
'short_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'tutorial_status': ('django.db.models.fields.CharField', [], {'default': "'W'", 'max_length': '1'})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
complete_apps = ['zephyr']
|
||||||
@@ -71,7 +71,10 @@ class UserProfile(AbstractBaseUser):
|
|||||||
email = models.EmailField(blank=False, db_index=True, unique=True)
|
email = models.EmailField(blank=False, db_index=True, unique=True)
|
||||||
is_staff = models.BooleanField(default=False)
|
is_staff = models.BooleanField(default=False)
|
||||||
is_active = models.BooleanField(default=True)
|
is_active = models.BooleanField(default=True)
|
||||||
|
is_bot = models.BooleanField(default=False)
|
||||||
date_joined = models.DateTimeField(default=timezone.now)
|
date_joined = models.DateTimeField(default=timezone.now)
|
||||||
|
bot_owner = models.ForeignKey('self', null=True, on_delete=models.SET_NULL)
|
||||||
|
|
||||||
USERNAME_FIELD = 'email'
|
USERNAME_FIELD = 'email'
|
||||||
|
|
||||||
# Our custom site-specific fields
|
# Our custom site-specific fields
|
||||||
|
|||||||
Reference in New Issue
Block a user