Make organisations support multiple "managers" and not just one
authorMagnus Hagander <magnus@hagander.net>
Fri, 26 Feb 2010 11:34:19 +0000 (12:34 +0100)
committerMagnus Hagander <magnus@hagander.net>
Fri, 26 Feb 2010 11:34:19 +0000 (12:34 +0100)
"submitter", thus making it possible for a single person to manage
multiple organisations, as well as for a single organisation to have
multiple different manages.

Re-hook events and news items to use organisation of the submitter
instead of the user who did the submission. (product listings already
did this)

pgweb/account/views.py
pgweb/core/admin.py
pgweb/core/forms.py
pgweb/core/models.py
pgweb/downloads/forms.py
pgweb/downloads/models.py
pgweb/events/forms.py
pgweb/events/models.py
pgweb/news/forms.py
pgweb/news/models.py
templates/events/item.html

index 36da543d7a31b68f8a6780f8712f0d1bafe69a2b..5016855c1a75ba58cb13a87fe0525870cb8069ea 100644 (file)
@@ -15,10 +15,10 @@ from pgweb.downloads.models import Product
 @ssl_required
 @login_required
 def home(request):
-       myarticles = NewsArticle.objects.filter(submitter=request.user)
-       myevents = Event.objects.filter(submitter=request.user)
-       myorgs = Organisation.objects.filter(submitter=request.user)
-       myproducts = Product.objects.filter(publisher__submitter=request.user)
+       myarticles = NewsArticle.objects.filter(org__managers=request.user)
+       myevents = Event.objects.filter(org__managers=request.user)
+       myorgs = Organisation.objects.filter(managers=request.user)
+       myproducts = Product.objects.filter(publisher__managers=request.user)
        return render_to_response('account/index.html', {
                'newsarticles': myarticles,
                'events': myevents,
index c28b2ff08c68a049ab2488d1ca01802500ae20f3..dacb1e26e51092e6ff04502886fa8404c2bca32e 100644 (file)
@@ -9,7 +9,8 @@ class OrganisationAdmin(admin.ModelAdmin):
        list_display = ('name', 'approved', 'lastconfirmed',)
        list_filter = ('approved',)
        ordering = ('name', )
-
+       filter_horizontal = ('managers', )
+       search_fields = ('name', )
 
 admin.site.register(Version)
 admin.site.register(OrganisationType)
index 9fbb8d1ff90e895d13c985a3db85a1a09fa3a2df..d051018856026a93c8348a86010003b13dee55aa 100644 (file)
@@ -5,5 +5,5 @@ from models import Organisation
 class OrganisationForm(forms.ModelForm):
        class Meta:
                model = Organisation
-               exclude = ('lastconfirmed', 'approved', 'submitter', )
+               exclude = ('lastconfirmed', 'approved', 'managers', )
 
index bf2d17337e691497ab59446df4910985428f960f..823d029abe6ea1efd02d519051e6a5725098e7c2 100644 (file)
@@ -44,7 +44,7 @@ class Organisation(PgModel, models.Model):
        email = models.EmailField(null=False, blank=True)
        phone = models.CharField(max_length=100, null=False, blank=True)
        orgtype = models.ForeignKey(OrganisationType, null=False, blank=False)
-       submitter = models.ForeignKey(User, null=False, blank=False)
+       managers = models.ManyToManyField(User, null=False, blank=False)
        lastconfirmed = models.DateTimeField(null=False, blank=False, default=datetime.now())
 
        send_notification = True
index cd1f650787e868c88250ebbc64ef432e72fedf2b..7986578e3deb96734b43cc89ecc17819ba881fea 100644 (file)
@@ -9,8 +9,7 @@ If you have not done so, use <a href="/account/organisations/new/">this form</a>
        def __init__(self, *args, **kwargs):
                super(ProductForm, self).__init__(*args, **kwargs)
        def filter_by_user(self, user):
-               print "Filter to user %s" % user
-               self.fields['publisher'].queryset = Organisation.objects.filter(submitter=user)
+               self.fields['publisher'].queryset = Organisation.objects.filter(managers=user, approved=True)
        class Meta:
                model = Product
                exclude = ('lastconfirmed', 'approved', )
index f10dde1c4882ec9a049b46d5bc10953e06f40baa..0252f7780a59265e263f57706c4a090c07dea75b 100644 (file)
@@ -87,7 +87,7 @@ class Product(PgModel, models.Model):
                return self.name
 
        def verify_submitter(self, user):
-               return (user == self.publisher.submitter)
+               return (len(self.publisher.managers.filter(pk=user.pk)) == 1)
 
        class Meta:
                ordering = ('name',)
index e830eed001d1fbb471553d92015fb2050de2e795..02b5c30dd7894e28625ffa09412227740f1d07db 100644 (file)
@@ -7,7 +7,7 @@ class EventForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
                super(EventForm, self).__init__(*args, **kwargs)
        def filter_by_user(self, user):
-               self.fields['org'].queryset = Organisation.objects.filter(submitter=user)
+               self.fields['org'].queryset = Organisation.objects.filter(managers=user, approved=True)
        class Meta:
                model = Event
                exclude = ('submitter', 'approved', )
index 2b00bc4202a4f3fbf7d695150dcd62b1f03e5c1c..25165090caa0928322a0a859657172507f9a92f5 100644 (file)
@@ -6,7 +6,6 @@ from pgweb.util.bases import PgModel
 from core.models import Country, Organisation
 
 class Event(models.Model, PgModel):
-       submitter = models.ForeignKey(User, null=False, blank=False)
        approved = models.BooleanField(null=False, blank=False, default=False)
 
        org = models.ForeignKey(Organisation, null=False, blank=False)
@@ -28,11 +27,18 @@ class Event(models.Model, PgModel):
        def __unicode__(self):
                return "%s: %s" % (self.startdate, self.title)
 
+       def verify_submitter(self, user):
+               return (len(self.org.managers.filter(pk=user.pk)) == 1)
+
        @property
-       def has_submitter(self):
-               # If submitter is 0 it means migrated, so have no submitter
-               if self.submitter_id == 0: return False
-               return True
+       def has_organisation(self):
+               mgrs = self.org.managers.all()
+               if len(mgrs) == 1:
+                       if mgrs[0].pk == 0:
+                               return False # Migration organisation
+                       else:
+                               return True # Has an actual organisation
+               return False # Has no organisastion at all
 
        @property
        def displaydate(self):
index 3cdf48714eccbddfc3e4b036e6f4e358f1b59781..39726d4a2993d373b4e87a9cb62381fd1d33b951 100644 (file)
@@ -1,8 +1,13 @@
 from django import forms
 
+from pgweb.core.models import Organisation
 from models import NewsArticle
 
 class NewsArticleForm(forms.ModelForm):
+       def __init__(self, *args, **kwargs):
+               super(NewsArticleForm, self).__init__(*args, **kwargs)
+       def filter_by_user(self, user):
+               self.fields['org'].queryset = Organisation.objects.filter(managers=user, approved=True)
        class Meta:
                model = NewsArticle
                exclude = ('submitter', 'approved', )
index 04f2311565850b0f6e8b4db69d6268ec08104696..dba8dbde4933f3cd1da2689ca580ff844ec17962 100644 (file)
@@ -1,10 +1,10 @@
 from django.db import models
-from django.contrib.auth.models import User
 from datetime import date
+from pgweb.core.models import Organisation
 from pgweb.util.bases import PgModel
 
 class NewsArticle(PgModel, models.Model):
-       submitter = models.ForeignKey(User, null=False, blank=False)
+       org = models.ForeignKey(Organisation, null=False, blank=False)
        approved = models.BooleanField(null=False, blank=False, default=False)
        date = models.DateField(null=False, blank=False, default=date.today)
        title = models.CharField(max_length=200, null=False, blank=False)
@@ -16,5 +16,8 @@ class NewsArticle(PgModel, models.Model):
        def __unicode__(self):
                return "%s: %s" % (self.date, self.title)
        
+       def verify_submitter(self, user):
+               return (len(self.org.managers.filter(pk=user.pk)) == 1)
+
        class Meta:
                ordering = ('-date',)
index 253b6fc02943f5f5f9e8175f572dc088cdd8d4a1..470e58efa7c16db77b575f1be4f343796e5afb04 100644 (file)
@@ -7,8 +7,8 @@
 <p>
 {{obj.details|markdown:"safe"}}
 </p>
-{%if obj.has_submitter%}
-<p>Posted by {{obj.submitter.email}}.</p>
+{%if obj.has_organisation%}
+<p>Posted by {{obj.org}}{%if obj.org.email%} ({{obj.org.email}}){%endif%}.</p>
 {%else%}
 <p><i>This event has been migrated from a previous version of the PostgreSQL
 website. We apologise for any formatting issues caused by the migration.</i></p>