Verified Commit 0c8ef662 authored by Sébastiaan Versteeg's avatar Sébastiaan Versteeg
Browse files

Add and change documentation in the activemembers package

parent dc43cab9
"""Registers admin interfaces for the activemembers module"""
import csv
import datetime
......@@ -30,6 +31,7 @@ class CommitteeMembershipInlineFormSet(forms.BaseInlineFormSet):
class CommitteeMembershipInline(admin.StackedInline):
"""Inline for committee memberships"""
model = models.CommitteeMembership
formset = CommitteeMembershipInlineFormSet
can_delete = False
......@@ -56,6 +58,7 @@ class CommitteeForm(forms.ModelForm):
@admin.register(models.Committee)
class CommitteeAdmin(TranslatedModelAdmin):
"""Manage the committees"""
inlines = (CommitteeMembershipInline,)
form = CommitteeForm
list_display = ('name', 'since', 'until', 'active', 'email')
......@@ -81,6 +84,7 @@ class CommitteeAdmin(TranslatedModelAdmin):
@admin.register(models.Board)
class BoardAdmin(TranslatedModelAdmin):
"""Manage the board"""
inlines = (CommitteeMembershipInline,)
form = CommitteeForm
exclude = ('is_board',)
......@@ -91,6 +95,7 @@ class BoardAdmin(TranslatedModelAdmin):
class BoardFilter(admin.SimpleListFilter):
"""Filter memberships on board-only"""
title = _('board memberships')
parameter_name = 'board'
......@@ -110,6 +115,7 @@ class BoardFilter(admin.SimpleListFilter):
class LectureYearFilter(admin.SimpleListFilter):
"""Filter the memberships on those started or ended in a lecture year"""
title = _('lecture year')
parameter_name = 'lecture_year'
......@@ -134,6 +140,7 @@ class LectureYearFilter(admin.SimpleListFilter):
@admin.register(models.CommitteeMembership)
class CommitteeMembershipAdmin(TranslatedModelAdmin):
"""Manage the committee memberships"""
form = CommitteeMembershipForm
list_display = ('member', 'committee', 'since', 'until', 'chair', 'role')
list_filter = ('committee', BoardFilter, LectureYearFilter)
......@@ -185,4 +192,5 @@ class CommitteeMembershipAdmin(TranslatedModelAdmin):
@admin.register(models.Mentorship)
class MentorshipAdmin(admin.ModelAdmin):
"""Manage the mentorships"""
list_select_related = ('member',)
"""Configuration for the activemembers package"""
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class ActiveMembersConfig(AppConfig):
"""AppConfig for the activemembers package"""
name = 'activemembers'
verbose_name = _('Active members')
"""The forms defined by the activemembers module"""
from django import forms
from activemembers.models import CommitteeMembership
......@@ -5,6 +6,7 @@ from members.models import Member
class CommitteeMembershipForm(forms.ModelForm):
"""Custom form for committee memberships that orders the members"""
member = forms.ModelChoiceField(
queryset=Member.objects.order_by('first_name',
'last_name'))
......
"""The models defined by the activemembers package"""
import datetime
import logging
......@@ -44,7 +45,7 @@ class ActiveCommitteeManager(models.Manager):
class Committee(models.Model, metaclass=ModelTranslateMeta):
"""A committee"""
"""Describes a committee"""
unfiltered_objects = UnfilteredSortedManager()
objects = CommitteeManager()
......@@ -115,7 +116,6 @@ class Committee(models.Model, metaclass=ModelTranslateMeta):
max_length=50)
def clean(self):
"""Validation"""
if ((self.contact_email is not None and
self.contact_mailinglist is not None) or
(self.contact_email is None and
......@@ -142,6 +142,10 @@ class Committee(models.Model, metaclass=ModelTranslateMeta):
class BoardManager(models.Manager):
"""
Custom manager that filters out
instances of Committee that are not boards
"""
use_in_migrations = True
......@@ -180,7 +184,6 @@ class Board(Committee):
str(self.until.year)])
def validate_unique(self, *args, **kwargs):
""" Check uniqueness"""
super().validate_unique(*args, **kwargs)
boards = Board.objects.all()
if self.since is not None:
......@@ -199,14 +202,16 @@ class Board(Committee):
class ActiveMembershipManager(models.Manager):
"""Get only active memberships"""
"""
Customs manager that gets the currently active committee memberships
"""
def get_queryset(self):
"""Get the currently active committee memberships"""
return super().get_queryset().exclude(until__lt=timezone.now().date())
class CommitteeMembership(models.Model, metaclass=ModelTranslateMeta):
"""Describes a committee membership"""
objects = models.Manager()
active_memberships = ActiveMembershipManager()
......@@ -253,7 +258,7 @@ class CommitteeMembership(models.Model, metaclass=ModelTranslateMeta):
@property
def initial_connected_membership(self):
""" Find the oldest membership directly connected to the current one"""
"""Find the oldest membership directly connected to the current one"""
qs = CommitteeMembership.objects.filter(
committee=self.committee,
member=self.member,
......@@ -270,7 +275,6 @@ class CommitteeMembership(models.Model, metaclass=ModelTranslateMeta):
return self.until is None or self.until > timezone.now().date()
def clean(self):
"""Validation"""
if self.until and (not self.since or self.until < self.since):
raise ValidationError(
{'until': _("End date can't be before start date")})
......@@ -296,7 +300,6 @@ class CommitteeMembership(models.Model, metaclass=ModelTranslateMeta):
pass
def validate_unique(self, *args, **kwargs):
""" Check uniqueness"""
super().validate_unique(*args, **kwargs)
# Check if a committee has more than one chair
if self.chair:
......@@ -354,6 +357,7 @@ class CommitteeMembership(models.Model, metaclass=ModelTranslateMeta):
class Mentorship(models.Model):
"""Describe a mentorship during the orientation"""
member = models.ForeignKey(
'members.Member',
on_delete=models.CASCADE,
......
"""
Activemembers URL Configuration
"""
"""The routes defined by the activemembers package"""
from django.conf.urls import url
from . import views
......@@ -11,7 +8,7 @@ app_name = "activemembers"
urlpatterns = [
url(r'committees/$', views.committee_index, name='committees'),
url(r'^committees/(?P<id>\d+)/$', views.committee_detail, name='committee'),
url(r'^committees/(?P<pk>\d+)/$', views.committee_detail, name='committee'),
url(r'^boards/$', views.board_index, name='boards'),
url(r'^board/(?P<since>\d{4})$', views.board_detail, name='board'),
url(r'^board/(?P<since>\d{4})-(?P<until>\d{4})$', views.board_detail, name='board'),
......
......@@ -6,8 +6,11 @@ from .models import Board, Committee, CommitteeMembership
def committee_index(request):
"""Overview of committees"""
"""
View that renders the committee overview page
:param request: the request object
:return: response containing the HTML
"""
committees = Committee.active_committees.all().order_by(
localize_attr_name('name'))
......@@ -15,9 +18,14 @@ def committee_index(request):
{'committees': committees})
def committee_detail(request, id):
"""View the details of a committee"""
committee = get_object_or_404(Committee, pk=id)
def committee_detail(request, pk):
"""
View that renders the page of one selected committee
:param request: the request object
:param pk: pk of the selected committee
:return:
"""
committee = get_object_or_404(Committee, pk=pk)
members = []
memberships = (CommitteeMembership
......@@ -38,6 +46,11 @@ def committee_detail(request, id):
def board_index(request):
"""
View that renders the board overview page
:param request: the request object
:return: response containing the HTML
"""
current_year = datetime_to_lectureyear(datetime.date.today())
board = get_object_or_404(
Board, since__year=current_year, until__year=current_year+1)
......@@ -50,7 +63,13 @@ def board_index(request):
def board_detail(request, since, until=None):
"""View the details of a board"""
"""
View that renders the board for a specific lecture year
:param request: the request object
:param since: xxxx in xxxx-yyyy of the lecture year
:param until: yyyy in xxxx-yyyy of the lecture year
:return: response containing the HTML
"""
if not until: # try to correct /board/2016 to /2016-2017
return redirect(reverse('activemembers:board',
kwargs={'since': since,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment