mirror of
https://github.com/ae-utbm/sith.git
synced 2025-08-24 09:51:07 +00:00
trombi: add custom club memberships
Signed-off-by: Skia <skia@libskia.so>
This commit is contained in:
28
trombi/migrations/0004_trombiclubmembership.py
Normal file
28
trombi/migrations/0004_trombiclubmembership.py
Normal 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'],
|
||||
},
|
||||
),
|
||||
]
|
@@ -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')
|
||||
|
||||
|
44
trombi/templates/trombi/edit_profile.jinja
Normal file
44
trombi/templates/trombi/edit_profile.jinja
Normal 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 %}
|
||||
|
||||
|
||||
|
@@ -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>
|
||||
|
@@ -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'),
|
||||
]
|
||||
|
||||
|
@@ -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"
|
||||
|
Reference in New Issue
Block a user