trombi: add custom club memberships

Signed-off-by: Skia <skia@libskia.so>
This commit is contained in:
Skia
2017-06-12 23:52:59 +02:00
parent 5df9be9188
commit f26f2f4229
8 changed files with 276 additions and 59 deletions

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('trombi', '0003_trombicomment_is_moderated'),
]
operations = [
migrations.CreateModel(
name='TrombiClubMembership',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('club', models.CharField(default='', max_length=32, verbose_name='club')),
('role', models.CharField(default='', max_length=64, verbose_name='role')),
('start', models.CharField(default='', max_length=16, verbose_name='start')),
('end', models.CharField(default='', max_length=16, verbose_name='end')),
('user', models.ForeignKey(verbose_name='user', related_name='memberships', to='trombi.TrombiUser')),
],
options={
'ordering': ['id'],
},
),
]

View File

@@ -31,6 +31,7 @@ from django.core.exceptions import ValidationError
from datetime import timedelta, date
from core.models import User
from core.utils import get_start_of_semester, get_semester
from club.models import Club
class TrombiManager(models.Manager):
@@ -98,6 +99,24 @@ class TrombiUser(models.Model):
def __str__(self):
return str(self.user)
def make_memberships(self):
self.memberships.all().delete()
for m in self.user.memberships.filter(role__gt=settings.SITH_MAXIMUM_FREE_ROLE).order_by('end_date'):
role = str(settings.SITH_CLUB_ROLES[m.role])
if m.description:
role += " (%s)" % m.description
if m.end_date:
end_date = get_semester(m.end_date)
else:
end_date = ""
TrombiClubMembership(
user=self,
club=str(m.club),
role=role[:64],
start=get_semester(m.start_date),
end=end_date,
).save()
class TrombiComment(models.Model):
"""
This represent a comment given by someone to someone else in the same Trombi
@@ -113,3 +132,25 @@ class TrombiComment(models.Model):
return False
return user.id == self.author.user.id or user.can_edit(self.author.trombi)
class TrombiClubMembership(models.Model):
"""
This represent a membership to a club
"""
user = models.ForeignKey(TrombiUser, verbose_name=_("user"), related_name='memberships')
club = models.CharField(_("club"), max_length=32, default="")
role = models.CharField(_("role"), max_length=64, default="")
start = models.CharField(_("start"), max_length=16, default="")
end = models.CharField(_("end"), max_length=16, default="")
class Meta:
ordering = ['id']
def __str__(self):
return "%s - %s - %s (%s)" % (self.user, self.club, self.role, self.start)
def can_be_edited_by(self, user):
return user.id == self.user.user.id or user.can_edit(self.user.trombi)
def get_absolute_url(self):
return reverse('trombi:profile')

View File

@@ -0,0 +1,44 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Edit profile{% endtrans %}
{% endblock %}
{% block content %}
<h2>{% trans %}Edit profile{% endtrans %}</h2>
<p> <a href="{{ url('trombi:user_tools') }}">{% trans %}Back to tools{% endtrans %}</a></p>
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p() }}
<p><input type="submit" value="{% trans %}Save{% endtrans %}" /></p>
</form>
<h4>{% trans %}Club{% endtrans %}</h4>
<a href="{{ url('trombi:reset_memberships') }}">
{% trans %}Reset club memberships in Trombi (delete exising ones, does not impact real club memberships){% endtrans %}
</a>
<table style="max-width: 80%; margin: auto;">
<thead>
<tr>
<td>{% trans %}Club{% endtrans %}</td>
<td>{% trans %}Role{% endtrans %}</td>
<td>{% trans %}Dates{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for m in user.trombi_user.memberships.all() %}
<tr>
<td>{{ m.club }}</td>
<td>{{ m.role }}</td>
<td>{{ m.start }} - {{ m.end }}</td>
<td>
<a href="{{ url('trombi:edit_membership', membership_id=m.id) }}">{% trans %}Edit{% endtrans %}</a>
<a href="{{ url('trombi:delete_membership', membership_id=m.id) }}">{% trans %}Delete{% endtrans %}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@@ -8,6 +8,7 @@
<h3>{% trans user_name=trombi_user.user.get_display_name() %}{{ user_name }}'s Trombi profile{% endtrans %}</h3>
<p> <a href="{{ url('trombi:user_tools') }}">{% trans %}Back to tools{% endtrans %}</a></p>
<div>
<h4>{% trans %}Pictures{% endtrans %}</h4>
{% set profile_file = None %}
{% set scrub_file = None %}
{% if trombi_user.profile_pict %}
@@ -20,10 +21,36 @@
{% else %}
{% set scrub_file = static('core/img/na.gif') %}
{% endif %}
<div style="max-width: 410px; margin: auto;">
<img src="{{ profile_file }}" alt="" style="max-width: 200px">
<img src="{{ scrub_file }}" alt="" style="max-width: 200px">
<div style="max-width: 410px; margin: auto; text-align: center;">
<div>
<img src="{{ profile_file }}" alt="" style="max-width: 200px">
<img src="{{ scrub_file }}" alt="" style="max-width: 200px">
</div>
<div>
<em>{{ trombi_user.user.get_short_name() }}</em>
</div>
</div>
{% if trombi_user.memberships.exists() %}
<h4>{% trans %}Club{% endtrans %}</h4>
<table style="max-width: 70%; margin: auto;">
<thead>
<tr>
<td>{% trans %}Club{% endtrans %}</td>
<td>{% trans %}Role{% endtrans %}</td>
<td>{% trans %}Date{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for m in trombi_user.memberships.all() %}
<tr>
<td>{{ m.club }}</td>
<td>{{ m.role }}</td>
<td>{{ m.start }} - {{ m.end }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<dl>
{% for c in trombi_user.received_comments.filter(is_moderated=True) %}
<dt style="font-weight: bold; font-size: 110%">{{ c.author.user.get_display_name() }}</dt>

View File

@@ -39,5 +39,8 @@ urlpatterns = [
url(r'^tools$', UserTrombiToolsView.as_view(), name='user_tools'),
url(r'^profile$', UserTrombiEditProfileView.as_view(), name='profile'),
url(r'^pictures$', UserTrombiEditPicturesView.as_view(), name='pictures'),
url(r'^reset_memberships$', UserTrombiResetClubMembershipsView.as_view(), name='reset_memberships'),
url(r'^membership/(?P<membership_id>[0-9]+)/edit$', UserTrombiEditMembershipView.as_view(), name='edit_membership'),
url(r'^membership/(?P<membership_id>[0-9]+)/delete$', UserTrombiDeleteMembershipView.as_view(), name='delete_membership'),
]

View File

@@ -34,7 +34,7 @@ from django.forms.models import modelform_factory
from datetime import date
from trombi.models import Trombi, TrombiUser, TrombiComment
from trombi.models import Trombi, TrombiUser, TrombiComment, TrombiClubMembership
from core.views.forms import SelectFile, SelectDate
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, TabedViewMixin, CanCreateMixin, QuickNotifMixin
from core.models import User
@@ -210,7 +210,7 @@ class UserTrombiEditProfileView(UpdateView):
'phone': _("Phone"),
'parent_address': _("Native town"),
})
template_name = "core/edit.jinja"
template_name = "trombi/edit_profile.jinja"
def get_object(self):
return self.request.user
@@ -218,6 +218,29 @@ class UserTrombiEditProfileView(UpdateView):
def get_success_url(self):
return reverse('trombi:user_tools')+"?qn_success"
class UserTrombiResetClubMembershipsView(RedirectView):
permanent = False
def get(self, request, *args, **kwargs):
user = self.request.user.trombi_user
user.make_memberships()
return redirect(self.get_success_url())
def get_success_url(self):
return reverse('trombi:user_tools')+"?qn_success"
class UserTrombiDeleteMembershipView(DeleteView, CanEditMixin):
model = TrombiClubMembership
pk_url_kwarg = "membership_id"
template_name = "core/delete_confirm.jinja"
success_url = reverse_lazy('trombi:profile')
class UserTrombiEditMembershipView(UpdateView, CanEditMixin):
model = TrombiClubMembership
pk_url_kwarg = "membership_id"
fields = ['role', 'start', 'end']
template_name = "core/edit.jinja"
class UserTrombiProfileView(DetailView):
model = TrombiUser
pk_url_kwarg = "user_id"