diff --git a/accounts/migrations/0004_peers.py b/accounts/migrations/0004_peers.py index 72d37b11d6753bc97c6e94182d0a711589fc87c4..f411858ad38002dd756779216e7e8588a5494241 100644 --- a/accounts/migrations/0004_peers.py +++ b/accounts/migrations/0004_peers.py @@ -11,10 +11,11 @@ class Migration(DataMigration): user.peers.add(user.peer) user.save() - - def backwards(self, orm): - pass + for user in orm.UserProfile.objects.all(): + user.peer = user.peers.all()[0] + user.save() + models = { 'accounts.userprofile': { diff --git a/accounts/migrations/0005_auto__chg_field_userprofile_peer.py b/accounts/migrations/0005_auto__chg_field_userprofile_peer.py new file mode 100644 index 0000000000000000000000000000000000000000..f0ddfcffba3c22f33068a7d4d9ee3dbdf2751e99 --- /dev/null +++ b/accounts/migrations/0005_auto__chg_field_userprofile_peer.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'UserProfile.peer' + db.alter_column('accounts_userprofile', 'peer_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['peers.Peer'], null=True)) + + def backwards(self, orm): + + # Changing field 'UserProfile.peer' + db.alter_column('accounts_userprofile', 'peer_id', self.gf('django.db.models.fields.related.ForeignKey')(default='', to=orm['peers.Peer'])) + + models = { + 'accounts.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'peer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['peers.Peer']", 'null': 'True', 'blank': 'True'}), + 'peers': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'user_profile'", 'symmetrical': 'False', 'to': "orm['peers.Peer']"}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'peers.peer': { + 'Meta': {'ordering': "['peer_name']", 'object_name': 'Peer', 'db_table': "u'peer'"}, + 'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}), + 'peer_as': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'peer_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'}) + }, + 'peers.peerrange': { + 'Meta': {'ordering': "['network']", 'object_name': 'PeerRange', 'db_table': "u'peer_range'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'network': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'peers.techcemail': { + 'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['accounts'] \ No newline at end of file diff --git a/accounts/migrations/0006_auto__del_field_userprofile_peer.py b/accounts/migrations/0006_auto__del_field_userprofile_peer.py new file mode 100644 index 0000000000000000000000000000000000000000..a587b6368dced463710718a7a9111e7daf106892 --- /dev/null +++ b/accounts/migrations/0006_auto__del_field_userprofile_peer.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'UserProfile.peer' + db.delete_column('accounts_userprofile', 'peer_id') + + + def backwards(self, orm): + # Adding field 'UserProfile.peer' + db.add_column('accounts_userprofile', 'peer', + self.gf('django.db.models.fields.related.ForeignKey')(to=orm['peers.Peer'], null=True, blank=True), + keep_default=False) + + + models = { + 'accounts.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'peers': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'user_profile'", 'symmetrical': 'False', 'to': "orm['peers.Peer']"}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'peers.peer': { + 'Meta': {'ordering': "['peer_name']", 'object_name': 'Peer', 'db_table': "u'peer'"}, + 'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}), + 'peer_as': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'peer_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'}) + }, + 'peers.peerrange': { + 'Meta': {'ordering': "['network']", 'object_name': 'PeerRange', 'db_table': "u'peer_range'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'network': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'peers.techcemail': { + 'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['accounts'] \ No newline at end of file diff --git a/accounts/models.py b/accounts/models.py index 78858d7f940a5c18f915faeee9303f253c7eea7c..5b9a7f7ca3881245f4aef7abee1542b45382c1ef 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -24,7 +24,6 @@ from peers.models import Peer class UserProfile(models.Model): user = models.OneToOneField(User) - peer = models.ForeignKey(Peer) peers = models.ManyToManyField(Peer, related_name='user_profile') class Meta: diff --git a/accounts/views.py b/accounts/views.py index d31773050bc56805d0ac03d19f1534e0c91c00ce..35c0e280b9657ec9f13f5f8a82bc2f3b33da384b 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -72,8 +72,6 @@ def activate(request, activation_key): ) form = UserProfileForm(instance=userProfile) - form.fields['user'] = forms.ModelChoiceField(queryset=User.objects.filter(pk=rp.user.pk), empty_label=None) - form.fields['peer'] = forms.ModelChoiceField(queryset=Peer.objects.all(), empty_label=None) return render( request, @@ -90,7 +88,8 @@ def activate(request, activation_key): try: user = User.objects.get(pk=request_data['user']) up = user.get_profile() - up.peer = Peer.objects.get(pk=request_data['peer']) + for peer in request_data['peers']: + up.peers.add(Peer.objects.get(pk=peer)) up.save() except: diff --git a/flowspec/admin.py b/flowspec/admin.py index c482122a49833f05e7dfca58fd55158072e1eb28..18c9a5193d5f009b288a46388832d3ac5d02a394 100644 --- a/flowspec/admin.py +++ b/flowspec/admin.py @@ -86,7 +86,7 @@ class UserProfileAdmin(UserAdmin): def get_userprofile_peers(self, instance): # instance is User instance - peers = instance.get_profile().peers.all() + peers = instance.userprofile.peers.all() return ''.join(('%s, ' % (peer.peer_name)) for peer in peers)[:-2] get_userprofile_peers.short_description = "User Peer(s)" diff --git a/flowspec/forms.py b/flowspec/forms.py index 33ce349c67923052c1682e3630658a9f410a9051..aec1d3027af3f9501fbec502e76731be747741ad 100644 --- a/flowspec/forms.py +++ b/flowspec/forms.py @@ -40,6 +40,7 @@ from django.core.mail import send_mail class UserProfileForm(forms.ModelForm): + class Meta: model = UserProfile @@ -99,7 +100,7 @@ class RouteForm(forms.ModelForm): else: peers = user.userprofile.peers.all() existing_routes = Route.objects.all() - existing_routes = existing_routes.filter(applier__userprofile__peer__in=peers) + existing_routes = existing_routes.filter(applier__userprofile__peers__in=peers) name = self.cleaned_data.get('name', None) protocols = self.cleaned_data.get('protocol', None) source = self.cleaned_data.get('source', None) diff --git a/flowspec/views.py b/flowspec/views.py index 9980e70df7e7ee56fb939f9cc9204a6c9c77e81b..885b8fec80ffe304498e6103fddd8a528f59e7e3 100644 --- a/flowspec/views.py +++ b/flowspec/views.py @@ -164,7 +164,7 @@ def group_routes(request): def group_routes_ajax(request): all_group_routes = [] try: - peers = request.user.get_profile().peers.prefetch_related('userprofile', 'userprofile_user', 'networks') + peers = request.user.get_profile().peers.prefetch_related('networks') except UserProfile.DoesNotExist: error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username return render( @@ -760,8 +760,6 @@ def selectinst(request): }, ) else: - form.fields['user'] = forms.ModelChoiceField(queryset=User.objects.filter(pk=user.pk), empty_label=None) - form.fields['institution'] = forms.ModelChoiceField(queryset=Peer.objects.all(), empty_label=None) return render( request, 'registration/select_institution.html', diff --git a/templates/registration/activate.html b/templates/registration/activate.html index 3e734abd7c33003657949abadbedc1779c7eb77b..2c4903146c4ba6587ce43875842b89c549ab5824 100644 --- a/templates/registration/activate.html +++ b/templates/registration/activate.html @@ -31,11 +31,11 @@ <!-- /.panel-heading --> <div class="panel-body"> <div class="alert {% if account %}alert-success{% else %}alert-info{% endif %}"> - {% if account %} - {{account}} {% trans "succesfully activated" %} - {% else %} - {% trans "The user has probably been already activated." %} - {% endif %} + {% if account %} + {{account}} {% trans "succesfully activated" %} + {% else %} + {% trans "The user has probably been already activated." %} + {% endif %} </div> </div> </div> diff --git a/templates/registration/activate_edit.html b/templates/registration/activate_edit.html index 5ccb4435a4ed1a760c40e8dc9553b1a186928feb..7b342013e8649df74b60351b961304d03ba4a263 100644 --- a/templates/registration/activate_edit.html +++ b/templates/registration/activate_edit.html @@ -12,6 +12,8 @@ } } </style> +<link href="{{STATIC_URL}}js/select2/select2.css" rel="stylesheet"> +<link href="{{STATIC_URL}}js/select2/select2-bootstrap.css" rel="stylesheet"> {% endblock %} {% block contentplaceholder %} @@ -43,27 +45,35 @@ {% endif %} </div> </div> - <div class="form-group {% if form.peer.errors %} has-error {% endif %}"> + <div class="form-group {% if form.peers.errors %} has-error {% endif %}"> <label class="col-md-2 control-label" for="id_peer"><b>{% trans "Institution" %}</b></label> <div class="col-md-8"> - {% render_field form.peer class+="form-control" %} - {% if form.peer.errors %} <span class="help-block"> {{ form.peer.errors|join:", " }} </span> + {% render_field form.peers class+="form-control" %} + {% if form.peers.errors %} <span class="help-block"> {{ form.peers.errors|join:", " }} </span> {% endif %} </div> </div> <div class="form-group"> - <div class="col-md-2"></div> - <div class="col-md-8"> - <button type="submit" id="applybutton" value="{% trans 'Apply' %}" class="btn btn-md btn-primary">{% trans "Activate" %}</button> - </div> - </div> + <div class="col-md-2"></div> + <div class="col-md-8"> + <button type="submit" id="applybutton" value="{% trans 'Apply' %}" class="btn btn-md btn-primary">{% trans "Activate" %}</button> + </div> + </div> - </div> - </div> - </div> - </div> + </div> + </div> + </div> + </div> </div> {% endblock %} +{% block pagejsbottom %} + <script type="text/javascript" src="{{STATIC_URL}}js/select2/select2.js"></script> + <script> + $(document).ready( function(){ + $('#id_peers').select2(); + }); + </script> +{% endblock %} diff --git a/templates/registration/select_institution.html b/templates/registration/select_institution.html index 1a173693cead13b9088b0aaf65aad10bf459a41e..bc1e292aa39f0b92ba90c76e81f8512cf9f3f74a 100644 --- a/templates/registration/select_institution.html +++ b/templates/registration/select_institution.html @@ -12,6 +12,8 @@ } } </style> +<link href="{{STATIC_URL}}js/select2/select2.css" rel="stylesheet"> +<link href="{{STATIC_URL}}js/select2/select2-bootstrap.css" rel="stylesheet"> {% endblock %} {% block contentplaceholder %} @@ -38,11 +40,11 @@ <p class="error">{{ form.non_field_errors}}</p> {% endif %} <div style="display: none">{{form.user}}</div> - <div class="form-group {% if form.peer.errors %} has-error {% endif %}"> + <div class="form-group {% if form.peers.errors %} has-error {% endif %}"> <label class="col-md-2 control-label" for="id_peer"><b>{% trans "Institution" %}</b></label> <div class="col-md-8"> - {% render_field form.peer class+="form-control" %} - {% if form.peer.errors %} <span class="help-block"> {{ form.peer.errors|join:", " }} </span> + {% render_field form.peers class+="form-control" %} + {% if form.peers.errors %} <span class="help-block"> {{ form.peers.errors|join:", " }} </span> {% endif %} </div> </div> @@ -63,3 +65,13 @@ {% endblock %} + + +{% block pagejsbottom %} + <script type="text/javascript" src="{{STATIC_URL}}js/select2/select2.js"></script> + <script> + $(document).ready( function(){ + $('#id_peers').select2(); + }); + </script> +{% endblock %}