From fe69cbcee1a0dcf7ba60e6fa82769cdb9ea953f9 Mon Sep 17 00:00:00 2001 From: klmp200 Date: Tue, 12 Sep 2017 21:10:32 +0200 Subject: [PATCH] Add page for clubs and inactive clubs --- api/views/club.py | 2 +- club/migrations/0010_auto_20170912_2028.py | 32 ++++++++++++++++++++++ club/models.py | 25 +++++++++++++++-- club/templates/club/club_detail.jinja | 4 +++ club/views.py | 8 +++++- core/management/commands/populate.py | 4 +++ core/models.py | 5 ++++ core/templates/core/page.jinja | 6 +++- core/templates/core/page_prop.jinja | 6 ++++ core/templates/core/pagerev_edit.jinja | 1 - core/views/forms.py | 14 ++++++++++ core/views/page.py | 31 ++++++++++----------- migrate.py | 14 +++++++++- sith/settings.py | 3 ++ 14 files changed, 132 insertions(+), 23 deletions(-) create mode 100644 club/migrations/0010_auto_20170912_2028.py diff --git a/api/views/club.py b/api/views/club.py index ca2a8c1b..42d70eb6 100644 --- a/api/views/club.py +++ b/api/views/club.py @@ -58,6 +58,6 @@ def FetchMailingLists(request): if key != settings.SITH_MAILING_FETCH_KEY: raise PermissionDenied data = '' - for mailing in Mailing.objects.filter(is_moderated=True).all(): + for mailing in Mailing.objects.filter(is_moderated=True, club__is_active=False).all(): data += mailing.fetch_format() + "\n" return Response(data) diff --git a/club/migrations/0010_auto_20170912_2028.py b/club/migrations/0010_auto_20170912_2028.py new file mode 100644 index 00000000..71bd639b --- /dev/null +++ b/club/migrations/0010_auto_20170912_2028.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +from club.models import Club + + +def generate_club_pages(apps, schema_editor): + for club in Club.objects.all(): + club.make_page() + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0024_auto_20170906_1317'), + ('club', '0009_auto_20170822_2232'), + ] + + operations = [ + migrations.AddField( + model_name='club', + name='is_active', + field=models.BooleanField(default=True, verbose_name='is active'), + ), + migrations.AddField( + model_name='club', + name='page', + field=models.OneToOneField(related_name='club', blank=True, null=True, to='core.Page'), + ), + migrations.RunPython(generate_club_pages), + ] diff --git a/club/models.py b/club/models.py index d2901505..0b51e830 100644 --- a/club/models.py +++ b/club/models.py @@ -33,11 +33,11 @@ from django.core.urlresolvers import reverse from django.utils import timezone from django.core.validators import RegexValidator, validate_email -from core.models import User, MetaGroup, Group, SithFile, RealGroup, Notification - +from core.models import User, MetaGroup, Group, SithFile, RealGroup, Notification, Page # Create your models here. + class Club(models.Model): """ The Club class, made as a tree to allow nice tidy organization @@ -58,6 +58,7 @@ class Club(models.Model): }, ) logo = models.ImageField(upload_to='club_logos', verbose_name=_('logo'), null=True, blank=True) + is_active = models.BooleanField(_('is active'), default=True) address = models.CharField(_('address'), max_length=254) # email = models.EmailField(_('email address'), unique=True) # This should, and will be generated automatically owner_group = models.ForeignKey(Group, related_name="owned_club", @@ -66,6 +67,7 @@ class Club(models.Model): view_groups = models.ManyToManyField(Group, related_name="viewable_club", blank=True) home = models.OneToOneField(SithFile, related_name='home_of_club', verbose_name=_("home"), null=True, blank=True, on_delete=models.SET_NULL) + page = models.OneToOneField(Page, related_name="club", blank=True, null=True) class Meta: ordering = ['name', 'unix_name'] @@ -102,6 +104,24 @@ class Club(models.Model): self.home = home self.save() + def make_page(self): + if not self.page: + root = User.objects.filter(username="root").first() + club_root = Page.objects.filter(name=settings.SITH_CLUB_ROOT_PAGE).first() + if root and club_root: + public = Group.objects.filter(id=settings.SITH_GROUP_PUBLIC_ID).first() + office = Group.objects.filter(name=self.unix_name + settings.SITH_BOARD_SUFFIX).first() + p = Page(name=self.unix_name) + p.parent = club_root + p.set_lock(root) + if public: + p.view_groups.add(public) + if office: + p.edit_groups.add(office) + p.save() + self.page = p + self.save() + def save(self, *args, **kwargs): with transaction.atomic(): creation = False @@ -122,6 +142,7 @@ class Club(models.Model): self.home.edit_groups = [board] self.home.view_groups = [member, subscribers] self.home.save() + self.make_page() def __str__(self): return self.name diff --git a/club/templates/club/club_detail.jinja b/club/templates/club/club_detail.jinja index daedbfcb..492ab30b 100644 --- a/club/templates/club/club_detail.jinja +++ b/club/templates/club/club_detail.jinja @@ -2,7 +2,11 @@ {% from 'core/macros.jinja' import user_profile_link %} {% block content %} + {% if club.page and club.page.revisions.exists() %} + {{ club.page.revisions.last().content|markdown }} + {% else %}

{% trans %}Club{% endtrans %}

+ {% endif %} {% endblock %} diff --git a/club/views.py b/club/views.py index a8206fe6..8ec785be 100644 --- a/club/views.py +++ b/club/views.py @@ -117,6 +117,12 @@ class ClubTabsMixin(TabedViewMixin): 'slug': 'edit', 'name': _("Edit"), }) + if self.object.page: + tab_list.append({ + 'url': reverse('core:page_edit', kwargs={'page_name': self.object.page.get_full_name()}), + 'slug': 'page_edit', + 'name': _('Edit club page') + }) tab_list.append({ 'url': reverse('club:club_sellings', kwargs={'club_id': self.object.id}), 'slug': 'sellings', @@ -348,7 +354,7 @@ class ClubEditPropView(ClubTabsMixin, CanEditPropMixin, UpdateView): """ model = Club pk_url_kwarg = "club_id" - fields = ['name', 'unix_name', 'parent'] + fields = ['name', 'unix_name', 'parent', 'is_active'] template_name = 'core/edit.jinja' current_tab = "props" diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py index 108a1fb5..2b870a38 100644 --- a/core/management/commands/populate.py +++ b/core/management/commands/populate.py @@ -147,6 +147,10 @@ Welcome to the wiki page! p.set_lock(root) PageRev(page=p, title="Laverie", author=root, content="Fonctionnement de la laverie").save() + p = Page(name=settings.SITH_CLUB_ROOT_PAGE) + p.set_lock(root) + p.save() + # Here we add a lot of test datas, that are not necessary for the Sith, but that provide a basic development environment if not options['prod']: # Adding user Skia diff --git a/core/models.py b/core/models.py index 8573fd4a..72e5a658 100644 --- a/core/models.py +++ b/core/models.py @@ -999,6 +999,11 @@ class Page(models.Model): except: return self.name + @property + def is_club_page(self): + unauthorized_parent = Page.objects.filter(name=settings.SITH_CLUB_ROOT_PAGE).first() + return unauthorized_parent is not None and (self == unauthorized_parent or unauthorized_parent in self.get_parent_list()) + def delete(self): self.unset_lock_recursive() self.set_lock_recursive(User.objects.get(id=0)) diff --git a/core/templates/core/page.jinja b/core/templates/core/page.jinja index 1e3d2368..a0acf036 100644 --- a/core/templates/core/page.jinja +++ b/core/templates/core/page.jinja @@ -25,12 +25,16 @@
{% if page %} + {% if page.club %} + {% trans %}View{% endtrans %} + {% else %} {% trans %}View{% endtrans %} + {% endif %} {% trans %}History{% endtrans %} {% if can_edit(page, user) %} {% trans %}Edit{% endtrans %} {% endif %} - {% if can_edit_prop(page, user) %} + {% if can_edit_prop(page, user) and not page.is_club_page %} {% trans %}Prop{% endtrans %} {% endif %} {% endif %} diff --git a/core/templates/core/page_prop.jinja b/core/templates/core/page_prop.jinja index 9f144cbb..9207f52c 100644 --- a/core/templates/core/page_prop.jinja +++ b/core/templates/core/page_prop.jinja @@ -1,12 +1,18 @@ {% extends "core/page.jinja" %} {% block content %} +{% if page %} +{{ super() }} +{% endif %}

{% trans %}Page properties{% endtrans %}

{% csrf_token %} {{ form.as_p() }}

+{% if page %} +{% trans %}Delete{% endtrans %} +{% endif %} {% endblock %} diff --git a/core/templates/core/pagerev_edit.jinja b/core/templates/core/pagerev_edit.jinja index 1cab48cb..a91c0d04 100644 --- a/core/templates/core/pagerev_edit.jinja +++ b/core/templates/core/pagerev_edit.jinja @@ -25,7 +25,6 @@ function make_preview() {

-{% trans %}Delete{% endtrans %}
{% endblock %} diff --git a/core/views/forms.py b/core/views/forms.py index 0bf40cd8..8770df79 100644 --- a/core/views/forms.py +++ b/core/views/forms.py @@ -269,3 +269,17 @@ class PagePropForm(forms.ModelForm): super(PagePropForm, self).__init__(*arg, **kwargs) self.fields['edit_groups'].required = False self.fields['view_groups'].required = False + + +class PageForm(forms.ModelForm): + class Meta: + model = Page + fields = ['parent', 'name', 'owner_group', 'edit_groups', 'view_groups'] + widgets = { + 'edit_groups': CheckboxSelectMultiple, + 'view_groups': CheckboxSelectMultiple, + } + + def __init__(self, *args, **kwargs): + super(PageForm, self).__init__(*args, **kwargs) + self.fields['parent'].queryset = self.fields['parent'].queryset.exclude(name=settings.SITH_CLUB_ROOT_PAGE).filter(club=None) diff --git a/core/views/page.py b/core/views/page.py index 9c6cfc37..64028fc5 100644 --- a/core/views/page.py +++ b/core/views/page.py @@ -27,13 +27,22 @@ from django.core.urlresolvers import reverse_lazy from django.views.generic import ListView, DetailView from django.views.generic.edit import UpdateView, CreateView, DeleteView from django.forms.models import modelform_factory -from django.forms import CheckboxSelectMultiple +from django.http import Http404 from core.models import Page, PageRev, LockError -from core.views.forms import MarkdownInput +from core.views.forms import MarkdownInput, PageForm, PagePropForm from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin +class CanEditPagePropMixin(CanEditPropMixin): + + def dispatch(self, request, *args, **kwargs): + res = super(CanEditPagePropMixin, self).dispatch(request, *args, **kwargs) + if self.object.is_club_page: + raise Http404 + return res + + class PageListView(CanViewMixin, ListView): model = Page template_name = 'core/page_list.jinja' @@ -88,12 +97,7 @@ class PageRevView(CanViewMixin, DetailView): class PageCreateView(CanCreateMixin, CreateView): model = Page - form_class = modelform_factory(Page, - fields=['parent', 'name', 'owner_group', 'edit_groups', 'view_groups', ], - widgets={ - 'edit_groups': CheckboxSelectMultiple, - 'view_groups': CheckboxSelectMultiple, - }) + form_class = PageForm template_name = 'core/page_prop.jinja' def get_initial(self): @@ -118,14 +122,9 @@ class PageCreateView(CanCreateMixin, CreateView): return ret -class PagePropView(CanEditPropMixin, UpdateView): +class PagePropView(CanEditPagePropMixin, UpdateView): model = Page - form_class = modelform_factory(Page, - fields=['parent', 'name', 'owner_group', 'edit_groups', 'view_groups', ], - widgets={ - 'edit_groups': CheckboxSelectMultiple, - 'view_groups': CheckboxSelectMultiple, - }) + form_class = PagePropForm template_name = 'core/page_prop.jinja' slug_field = '_full_name' slug_url_kwarg = 'page_name' @@ -189,7 +188,7 @@ class PageEditView(CanEditMixin, UpdateView): return super(PageEditView, self).form_valid(form) -class PageDeleteView(CanEditPropMixin, DeleteView): +class PageDeleteView(CanEditPagePropMixin, DeleteView): model = Page template_name = 'core/delete_confirm.jinja' pk_url_kwarg = 'page_id' diff --git a/migrate.py b/migrate.py index ce1ad397..3a2fbe33 100644 --- a/migrate.py +++ b/migrate.py @@ -1375,6 +1375,17 @@ def migrate_mailings(): MailingSubscription(mailing=mailing, email=to_unicode(mailing_sub['email'])).save() +def migrate_club_again(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute("SELECT * FROM asso") + + for club in cur: + try: + c = Club.objects.get(id=club['id_asso']) + c.is_disabled = club['hidden'] == 1 + except: pass + + def main(): print("Start at %s" % start) # Core @@ -1396,7 +1407,8 @@ def main(): # reset_sas_moderators() # migrate_forum() # reset_index('forum') - migrate_mailings() + # migrate_mailings() + migrate_club_again() end = datetime.datetime.now() print("End at %s" % end) print("Running time: %s" % (end - start)) diff --git a/sith/settings.py b/sith/settings.py index 4fc5e7fb..978ca479 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -296,6 +296,9 @@ SITH_LAUNDERETTE_MANAGER = { 'address': "6 Boulevard Anatole France, 90000 Belfort" } +# Main root for club pages +SITH_CLUB_ROOT_PAGE = "clubs" + # Define the date in the year serving as reference for the subscriptions calendar # (month, day) SITH_START_DATE = (8, 15) # 15th August