members package

Submodules

members.admin module

Register 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', '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]

Send 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]

Send 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]

Send 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]

Send 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]

Send 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]

Send 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', '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>, '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]

Derive a list of achievements of a member.

Committee and board memberships + mentorships

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

Derive 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'