From 9a8aa7ac20b2434ca99bac852754d58ec9897d8a Mon Sep 17 00:00:00 2001 From: Michael McDonald Date: Wed, 27 Sep 2017 20:11:20 -0700 Subject: [PATCH 1/6] Delegate Account Creation --- huxley/api/serializers/delegate.py | 34 ++++++++++++++++++- .../migrations/0024_auto_20170927_2010.py | 21 ++++++++++++ huxley/core/models.py | 2 +- huxley/www/js/components/DelegateSelect.js | 3 +- 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 huxley/core/migrations/0024_auto_20170927_2010.py diff --git a/huxley/api/serializers/delegate.py b/huxley/api/serializers/delegate.py index cb16ffef2..b2cbd20ce 100644 --- a/huxley/api/serializers/delegate.py +++ b/huxley/api/serializers/delegate.py @@ -1,11 +1,17 @@ # Copyright (c) 2011-2015 Berkeley Model United Nations. All rights reserved. # Use of this source code is governed by a BSD License (see LICENSE). +from datetime import datetime + +from django.contrib.auth.base_user import BaseUserManager +from django.core.mail import send_mail + from rest_framework import serializers +from huxley.accounts.models import User from huxley.api.serializers.assignment import AssignmentNestedSerializer from huxley.api.serializers.school import SchoolSerializer -from huxley.core.models import Delegate +from huxley.core.models import Assignment, Delegate class DelegateSerializer(serializers.ModelSerializer): @@ -25,6 +31,32 @@ class Meta: 'session_three', 'session_four', ) + def update(self, instance, validated_data): + if ('assignment' in validated_data and + validated_data['assignment'] != None + and not instance.assignment): + + names = instance.name.split(' ') + username = names[0] + '_' + str(instance.id) + password = BaseUserManager().make_random_password(10) + user = User.objects.create(delegate=instance, username=username,\ + user_type=User.TYPE_DELEGATE,\ + last_login=datetime.now(), + first_name=names[0], last_name=names[-1], + email=instance.email) + user.set_password(password) + user.save() + send_mail('A new account has been created for {0}!\n'.format(instance.name), + 'Username: {0}\n'.format(username) \ + + 'Password: {0}\n'.format(password) \ + + 'Please save this information! You will need it for ' + + 'important information and actions. You can access ' + + 'this account at huxley.bmun.org.', + 'no-reply@bmun.org', + [instance.email], fail_silently=False) + + return super(DelegateSerializer, self).update(instance, validated_data) + class DelegateNestedSerializer(serializers.ModelSerializer): assignment = AssignmentNestedSerializer(read_only=True) diff --git a/huxley/core/migrations/0024_auto_20170927_2010.py b/huxley/core/migrations/0024_auto_20170927_2010.py new file mode 100644 index 000000000..e1fae174a --- /dev/null +++ b/huxley/core/migrations/0024_auto_20170927_2010.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-09-27 20:10 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0023_auto_20170809_1436'), + ] + + operations = [ + migrations.AlterField( + model_name='delegate', + name='email', + field=models.EmailField(default='', max_length=254), + preserve_default=False, + ), + ] diff --git a/huxley/core/models.py b/huxley/core/models.py index 6643adf77..ad524ea65 100644 --- a/huxley/core/models.py +++ b/huxley/core/models.py @@ -429,7 +429,7 @@ class Delegate(models.Model): null=True, on_delete=models.SET_NULL) name = models.CharField(max_length=64) - email = models.EmailField(blank=True, null=True) + email = models.EmailField() created_at = models.DateTimeField(auto_now_add=True) summary = models.TextField(default='', blank=True, null=True) published_summary = models.TextField(default='', blank=True, null=True) diff --git a/huxley/www/js/components/DelegateSelect.js b/huxley/www/js/components/DelegateSelect.js index 58cff0566..497c22945 100644 --- a/huxley/www/js/components/DelegateSelect.js +++ b/huxley/www/js/components/DelegateSelect.js @@ -18,8 +18,7 @@ var DelegateSelect = React.createClass({ return ( From 9ff5ca814197b003af2599d4d54bbe3161dc05f0 Mon Sep 17 00:00:00 2001 From: Michael McDonald Date: Wed, 27 Sep 2017 20:11:43 -0700 Subject: [PATCH 2/6] Ran autoformatter --- huxley/api/serializers/delegate.py | 8 ++++---- huxley/core/migrations/0024_auto_20170927_2010.py | 10 ++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/huxley/api/serializers/delegate.py b/huxley/api/serializers/delegate.py index b2cbd20ce..4f2ecedf3 100644 --- a/huxley/api/serializers/delegate.py +++ b/huxley/api/serializers/delegate.py @@ -33,16 +33,16 @@ class Meta: def update(self, instance, validated_data): if ('assignment' in validated_data and - validated_data['assignment'] != None - and not instance.assignment): + validated_data['assignment'] != None and + not instance.assignment): names = instance.name.split(' ') username = names[0] + '_' + str(instance.id) password = BaseUserManager().make_random_password(10) user = User.objects.create(delegate=instance, username=username,\ user_type=User.TYPE_DELEGATE,\ - last_login=datetime.now(), - first_name=names[0], last_name=names[-1], + last_login=datetime.now(), + first_name=names[0], last_name=names[-1], email=instance.email) user.set_password(password) user.save() diff --git a/huxley/core/migrations/0024_auto_20170927_2010.py b/huxley/core/migrations/0024_auto_20170927_2010.py index e1fae174a..22090e328 100644 --- a/huxley/core/migrations/0024_auto_20170927_2010.py +++ b/huxley/core/migrations/0024_auto_20170927_2010.py @@ -7,15 +7,13 @@ class Migration(migrations.Migration): - dependencies = [ - ('core', '0023_auto_20170809_1436'), - ] + dependencies = [('core', '0023_auto_20170809_1436'), ] operations = [ migrations.AlterField( model_name='delegate', name='email', - field=models.EmailField(default='', max_length=254), - preserve_default=False, - ), + field=models.EmailField( + default='', max_length=254), + preserve_default=False, ), ] From 6ec2975019f454158f15468e460163c826537a84 Mon Sep 17 00:00:00 2001 From: Michael McDonald Date: Wed, 4 Oct 2017 20:34:08 -0700 Subject: [PATCH 3/6] Reduce calls on database --- huxley/api/serializers/delegate.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/huxley/api/serializers/delegate.py b/huxley/api/serializers/delegate.py index 4f2ecedf3..288e817ef 100644 --- a/huxley/api/serializers/delegate.py +++ b/huxley/api/serializers/delegate.py @@ -39,13 +39,14 @@ def update(self, instance, validated_data): names = instance.name.split(' ') username = names[0] + '_' + str(instance.id) password = BaseUserManager().make_random_password(10) - user = User.objects.create(delegate=instance, username=username,\ - user_type=User.TYPE_DELEGATE,\ - last_login=datetime.now(), - first_name=names[0], last_name=names[-1], - email=instance.email) - user.set_password(password) - user.save() + user = User.objects.create_user(username=username, + password=password, + delegate=instance, + user_type=User.TYPE_DELEGATE, + first_name=names[0], + last_name=names[-1], + email=instance.email) + send_mail('A new account has been created for {0}!\n'.format(instance.name), 'Username: {0}\n'.format(username) \ + 'Password: {0}\n'.format(password) \ From e1f54bb6c2249004268c05d47d6b7a56903b6596 Mon Sep 17 00:00:00 2001 From: Michael McDonald Date: Wed, 4 Oct 2017 20:34:20 -0700 Subject: [PATCH 4/6] Ran autoformatter --- huxley/api/serializers/delegate.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/huxley/api/serializers/delegate.py b/huxley/api/serializers/delegate.py index 288e817ef..75ee9a00b 100644 --- a/huxley/api/serializers/delegate.py +++ b/huxley/api/serializers/delegate.py @@ -39,13 +39,14 @@ def update(self, instance, validated_data): names = instance.name.split(' ') username = names[0] + '_' + str(instance.id) password = BaseUserManager().make_random_password(10) - user = User.objects.create_user(username=username, - password=password, - delegate=instance, - user_type=User.TYPE_DELEGATE, - first_name=names[0], - last_name=names[-1], - email=instance.email) + user = User.objects.create_user( + username=username, + password=password, + delegate=instance, + user_type=User.TYPE_DELEGATE, + first_name=names[0], + last_name=names[-1], + email=instance.email) send_mail('A new account has been created for {0}!\n'.format(instance.name), 'Username: {0}\n'.format(username) \ From 3b89df5dd0a953a88c605bcc934438a5493cb61f Mon Sep 17 00:00:00 2001 From: Michael McDonald Date: Wed, 4 Oct 2017 20:41:06 -0700 Subject: [PATCH 5/6] Fixed reassigning bug --- huxley/api/serializers/delegate.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/huxley/api/serializers/delegate.py b/huxley/api/serializers/delegate.py index 75ee9a00b..17b0ce5c2 100644 --- a/huxley/api/serializers/delegate.py +++ b/huxley/api/serializers/delegate.py @@ -33,8 +33,9 @@ class Meta: def update(self, instance, validated_data): if ('assignment' in validated_data and - validated_data['assignment'] != None and - not instance.assignment): + validated_data['assignment'] != None and + not instance.assignment + and not User.objects.filter(delegate__id=instance.id).exists()): names = instance.name.split(' ') username = names[0] + '_' + str(instance.id) From 2bd63b016a66f76a7a479565a43ac6b324cb4d37 Mon Sep 17 00:00:00 2001 From: Michael McDonald Date: Wed, 4 Oct 2017 20:41:15 -0700 Subject: [PATCH 6/6] Ran autoformatter --- huxley/api/serializers/delegate.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/huxley/api/serializers/delegate.py b/huxley/api/serializers/delegate.py index 17b0ce5c2..1a4a61d6b 100644 --- a/huxley/api/serializers/delegate.py +++ b/huxley/api/serializers/delegate.py @@ -33,9 +33,9 @@ class Meta: def update(self, instance, validated_data): if ('assignment' in validated_data and - validated_data['assignment'] != None and - not instance.assignment - and not User.objects.filter(delegate__id=instance.id).exists()): + validated_data['assignment'] != None and + not instance.assignment and + not User.objects.filter(delegate__id=instance.id).exists()): names = instance.name.split(' ') username = names[0] + '_' + str(instance.id)