members package

Submodules

members.admin module

This module registers admin pages for the models

class members.admin.AgeListFilter(request, params, model, model_admin)[source]

Bases: django.contrib.admin.filters.SimpleListFilter

lookups(request, model_admin)[source]

Must be overridden to return a list of tuples (value, verbose value)

parameter_name = 'birthday'
queryset(request, queryset)[source]

Return the filtered queryset.

title = 'Age'
class members.admin.HasPermissionsFilter(request, params, model, model_admin)[source]

Bases: django.contrib.admin.filters.SimpleListFilter

lookups(request, model_admin)[source]

Must be overridden to return a list of tuples (value, verbose value)

parameter_name = 'permissions'
queryset(request, queryset)[source]

Return the filtered queryset.

title = 'Has individual permissions'
class members.admin.MemberAdmin(model, admin_site)[source]

Bases: members.admin.UserAdmin

has_module_permission(reuqest)[source]

Return True if the given request has any permission in the given app label.

Can be overridden by the user in subclasses. In such case it should return True if the given request has permission to view the module on the admin index page and access the module’s index page. Overriding it does not restrict access to the add, change or delete views. Use ModelAdmin.has_(add|change|delete)_permission for that.

property media
class members.admin.MembershipInline(parent_model, admin_site)[source]

Bases: django.contrib.admin.options.StackedInline

classes = ['collapse']
extra = 0
property media
model

alias of members.models.membership.Membership

class members.admin.MembershipTypeListFilter(request, params, model, model_admin)[source]

Bases: django.contrib.admin.filters.SimpleListFilter

lookups(request, model_admin)[source]

Must be overridden to return a list of tuples (value, verbose value)

parameter_name = 'membership'
queryset(request, queryset)[source]

Return the filtered queryset.

title = 'current membership type'
class members.admin.ProfileInline(parent_model, admin_site)[source]

Bases: django.contrib.admin.options.StackedInline

can_delete = False
classes = ['collapse']
fields = ['starting_year', 'programme', 'address_street', 'address_street2', 'address_postal_code', 'address_city', 'address_country', 'student_number', 'phone_number', 'receive_optin', 'receive_newsletter', 'receive_magazine', 'birthday', 'show_birthday', 'auto_renew', 'initials', 'nickname', 'display_name_preference', 'profile_description', 'website', 'photo', 'emergency_contact', 'emergency_contact_phone_number', 'language', 'event_permissions']
get_fields(request, obj=None)[source]

Hook for specifying fields.

property media
model

alias of members.models.profile.Profile

class members.admin.UserAdmin(model, admin_site)[source]

Bases: django.contrib.auth.admin.UserAdmin

actions = ['address_csv_export', 'student_number_csv_export', 'email_csv_export', 'minimise_data']
add_form

alias of members.forms.UserCreationForm

address_csv_export(request, queryset)[source]
change_list_template = 'admin/members/change_list.html'
email_csv_export(request, queryset)[source]
fieldsets = (('Personal', {'fields': ('first_name', 'last_name', 'email', 'username', 'password')}), ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions', 'date_joined', 'last_login'), 'classes': ('collapse',)}))
form

alias of members.forms.UserChangeForm

get_urls()[source]
inlines = (<class 'members.admin.ProfileInline'>, <class 'members.admin.MembershipInline'>)
list_filter = (<class 'members.admin.MembershipTypeListFilter'>, 'is_superuser', <class 'members.admin.HasPermissionsFilter'>, 'groups', <class 'members.admin.AgeListFilter'>, 'profile__event_permissions', 'profile__auto_renew', 'profile__receive_optin', 'profile__receive_newsletter', 'profile__receive_magazine', 'profile__starting_year')
property media
minimise_data(request, queryset)[source]
student_number_csv_export(request, queryset)[source]

members.admin_views module

Admin views provided by the members package

class members.admin_views.IbanExportView(**kwargs)[source]

Bases: django.views.generic.base.View

Exports IBANs of users that have set auto renew to true in their accounts

dispatch(request, *args, **kwargs)
get(request, **kwargs) → django.http.response.HttpResponse[source]

members.apps module

Configuration for the members package

class members.apps.MembersConfig(app_name, app_module)[source]

Bases: django.apps.config.AppConfig

name = 'members'
verbose_name = 'Members'

members.decorators module

Decorators provided by the members package

class members.decorators.ActiveMembershipRequired(view_function)[source]

Bases: object

Decorator that checks if the user has an active membership

members.decorators.membership_required(view_function)[source]

members.emails module

The emails defined by the members package

members.emails.send_email_change_completion_message(change_request)[source]

Sends email to the member to confirm the email change

:param change_request the email change request entered by the user

members.emails.send_email_change_confirmation_messages(change_request)[source]

Sends emails to the old and new email address of a member to confirm the email change

:param change_request the email change request entered by the user

members.emails.send_expiration_announcement(dry_run=False)[source]

Sends an email to all members whose membership will end in the next 31 days to warn them about this

Parameters

dry_run – does not really send emails if True

members.emails.send_information_request(dry_run=False)[source]

Sends an email to all members to have them check their personal information

Parameters

dry_run – does not really send emails if True

members.emails.send_membership_announcement(dry_run=False)[source]

Sends an email to all members with a never ending membership excluding honorary members

Parameters

dry_run – does not really send emails if True

members.emails.send_welcome_message(user, password, language)[source]

Sends an email to a new mail welcoming them

Parameters
  • user – the new user

  • password – randomly generated password

  • language – selected language during registration

members.forms module

Forms defined by the members package

class members.forms.ProfileForm(*args, **kwargs)[source]

Bases: django.forms.models.ModelForm

Form with all the user editable fields of a Profile model

class Meta[source]

Bases: object

fields = ['show_birthday', 'address_street', 'address_street2', 'address_postal_code', 'address_city', 'address_country', 'phone_number', 'emergency_contact', 'emergency_contact_phone_number', 'website', 'profile_description', 'nickname', 'initials', 'display_name_preference', 'photo', 'language', 'receive_optin', 'receive_newsletter', 'receive_magazine', 'email_gsuite_only']
model

alias of members.models.profile.Profile

base_fields = {'address_city': <django.forms.fields.CharField object>, 'address_country': <django.forms.fields.TypedChoiceField object>, 'address_postal_code': <django.forms.fields.CharField object>, 'address_street': <django.forms.fields.CharField object>, 'address_street2': <django.forms.fields.CharField object>, 'display_name_preference': <django.forms.fields.TypedChoiceField object>, 'email_gsuite_only': <django.forms.fields.BooleanField object>, 'emergency_contact': <django.forms.fields.CharField object>, 'emergency_contact_phone_number': <django.forms.fields.CharField object>, 'initials': <django.forms.fields.CharField object>, 'language': <django.forms.fields.TypedChoiceField object>, 'nickname': <django.forms.fields.CharField object>, 'phone_number': <django.forms.fields.CharField object>, 'photo': <django.forms.fields.ImageField object>, 'profile_description': <django.forms.fields.CharField object>, 'receive_magazine': <django.forms.fields.BooleanField object>, 'receive_newsletter': <django.forms.fields.BooleanField object>, 'receive_optin': <django.forms.fields.BooleanField object>, 'show_birthday': <django.forms.fields.BooleanField object>, 'website': <django.forms.fields.URLField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.

class members.forms.UserChangeForm(*args, **kwargs)[source]

Bases: django.contrib.auth.forms.UserChangeForm

Custom user edit form that adds fields for first/last name and email It also force-lowercases the username on save

base_fields = {'date_joined': <django.forms.fields.DateTimeField object>, 'email': <django.forms.fields.CharField object>, 'first_name': <django.forms.fields.CharField object>, 'groups': <django.forms.models.ModelMultipleChoiceField object>, 'is_active': <django.forms.fields.BooleanField object>, 'is_staff': <django.forms.fields.BooleanField object>, 'is_superuser': <django.forms.fields.BooleanField object>, 'last_login': <django.forms.fields.DateTimeField object>, 'last_name': <django.forms.fields.CharField object>, 'password': <django.contrib.auth.forms.ReadOnlyPasswordHashField object>, 'user_permissions': <django.forms.models.ModelMultipleChoiceField object>, 'username': <django.forms.fields.CharField object>}
clean()[source]

Hook for doing any extra form-wide cleaning after Field.clean() has been called on every field. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field named ‘__all__’.

declared_fields = {'email': <django.forms.fields.CharField object>, 'first_name': <django.forms.fields.CharField object>, 'last_name': <django.forms.fields.CharField object>, 'password': <django.contrib.auth.forms.ReadOnlyPasswordHashField object>, 'username': <django.forms.fields.CharField object>}
property media

Return all media required to render the widgets on this form.

class members.forms.UserCreationForm(*args, **kwargs)[source]

Bases: django.contrib.auth.forms.UserCreationForm

Custom Form that removes the password fields from user creation and sends a welcome message when a user is created

class Meta[source]

Bases: object

fields = ('username', 'first_name', 'last_name', 'send_welcome_email')
base_fields = {'send_welcome_email': <django.forms.fields.BooleanField object>}
clean()[source]

Hook for doing any extra form-wide cleaning after Field.clean() has been called on every field. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field named ‘__all__’.

declared_fields = {'send_welcome_email': <django.forms.fields.BooleanField object>}
property media

Return all media required to render the widgets on this form.

password1 = None
password2 = None
save(commit=True)[source]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

members.middleware module

Middleware provided by the members package

class members.middleware.MemberMiddleware(get_response)[source]

Bases: object

Adds the member attribute to requests

members.middleware.get_member(request)[source]

members.services module

Services defined in the members package

members.services.confirm_email_change(change_request)None[source]

Mark the email change request as verified

Parameters

change_request – the email change request

members.services.execute_data_minimisation(dry_run=False, members=None) → List[members.models.member.Member][source]

Clean the profiles of members/users of whom the last membership ended at least 31 days ago

Parameters
  • dry_run – does not really remove data if True

  • members – queryset of members to process, optional

Returns

list of processed members

members.services.gen_stats_member_type() → Dict[str, int][source]

Generate a dictionary where every key is a member type with the value being the number of current members of that type

members.services.gen_stats_year() → Dict[str, Dict[str, int]][source]

Generate list with 6 entries, where each entry represents the total amount of Thalia members in a year. The sixth element contains all the multi-year students.

members.services.member_achievements(member) → List[source]

Derives a list of achievements of a member Committee and board memberships + mentorships

members.services.member_societies(member) → List[source]

Derives a list of societies a member was part of

members.services.process_email_change(change_request)None[source]

Change the user’s email address if the request was completed and send the completion email

Parameters

change_request – the email change request

members.services.verify_email_change(change_request)None[source]

Mark the email change request as verified

Parameters

change_request – the email change request

members.sitemaps module

Sitemaps defined by the members package

class members.sitemaps.StaticViewSitemap[source]

Bases: django.contrib.sitemaps.Sitemap

Static sitemap with members page

changefreq = 'daily'
items()[source]
location(item)[source]
priority = 0.5

members.urls module

The routes defined by the members package

members.views module

Views provided by the members package

class members.views.EmailChangeConfirmView(**kwargs)[source]

Bases: django.views.generic.base.View, django.views.generic.base.TemplateResponseMixin

View that renders an HTML template and confirms the old email address

dispatch(request, *args, **kwargs)
get(request, *args, **kwargs) → django.http.response.HttpResponse[source]
template_name = 'members/user/email_change_confirmed.html'
class members.views.EmailChangeFormView(**kwargs)[source]

Bases: django.views.generic.edit.CreateView

View that renders the email change form

dispatch(request, *args, **kwargs)
fields = ['email', 'member']
form_valid(form) → django.http.response.HttpResponse[source]

If the form is valid, save the associated model.

get_initial()dict[source]

Return the initial data to use for forms on this view.

model

alias of members.models.email_change.EmailChange

post(request, *args, **kwargs) → django.http.response.HttpResponse[source]

Handle POST requests: instantiate a form instance with the passed POST variables and then check if it’s valid.

template_name = 'members/user/email_change.html'
class members.views.EmailChangeVerifyView(**kwargs)[source]

Bases: django.views.generic.base.View, django.views.generic.base.TemplateResponseMixin

View that renders an HTML template and verifies the new email address

dispatch(request, *args, **kwargs)
get(request, *args, **kwargs) → django.http.response.HttpResponse[source]
template_name = 'members/user/email_change_verified.html'
class members.views.MembersIndex(**kwargs)[source]

Bases: django.views.generic.list.ListView

View that renders the members overview

context_object_name = 'members'
dispatch(request, *args, **kwargs)
get_context_data(**kwargs)dict[source]

Get the context for this view.

get_queryset()django.db.models.query.QuerySet[source]

Return the list of items for this view.

The return value must be an iterable and may be an instance of QuerySet in which case QuerySet specific behavior will be enabled.

keywords = None
model

alias of members.models.member.Member

paginate_by = 28
query_filter = ''
setup(request, *args, **kwargs)None[source]

Initialize attributes shared by all view methods.

template_name = 'members/index.html'
year_range = []
class members.views.ObtainThaliaAuthToken(**kwargs)[source]

Bases: rest_framework.authtoken.views.ObtainAuthToken

Custom override of the AuthToken view to force lowercase the username

post(request, *args, **kwargs) → django.http.response.HttpResponse[source]
class members.views.ProfileDetailView(**kwargs)[source]

Bases: django.views.generic.detail.DetailView

View that renders a member’s profile

context_object_name = 'member'
dispatch(request, *args, **kwargs)
get_context_data(**kwargs)dict[source]

Insert the single object into the context dict.

model

alias of members.models.member.Member

setup(request, *args, **kwargs)None[source]

Initialize attributes shared by all view methods.

template_name = 'members/user/profile.html'
class members.views.StatisticsView(**kwargs)[source]

Bases: django.views.generic.base.TemplateView

View that renders the statistics page

dispatch(request, *args, **kwargs)
get_context_data(**kwargs)dict[source]
template_name = 'members/statistics.html'
class members.views.UserProfileUpdateView(**kwargs)[source]

Bases: django.contrib.messages.views.SuccessMessageMixin, django.views.generic.edit.UpdateView

View that allows a user to update their profile

dispatch(request, *args, **kwargs)
form_class

alias of members.forms.ProfileForm

get_object(queryset=None)members.models.profile.Profile[source]

Return the object the view is displaying.

Require self.queryset and a pk or slug argument in the URLconf. Subclasses can override this to return any object.

model

alias of members.models.profile.Profile

success_message = 'Your profile has been updated successfully.'
success_url = '/user/edit-profile/'
template_name = 'members/user/edit_profile.html'