mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-09-16 14:57:38 +02:00
Compare commits
1 Commits
v1.0.3
...
3b305c5e35
Author | SHA1 | Date | |
---|---|---|---|
|
3b305c5e35 |
@@ -5,7 +5,7 @@ from django.contrib import admin
|
|||||||
from note_kfet.admin import admin_site
|
from note_kfet.admin import admin_site
|
||||||
|
|
||||||
from .forms import GuestForm
|
from .forms import GuestForm
|
||||||
from .models import Activity, ActivityType, Entry, Guest, Opener
|
from .models import Activity, ActivityType, Entry, Guest
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Activity, site=admin_site)
|
@admin.register(Activity, site=admin_site)
|
||||||
@@ -45,11 +45,3 @@ class EntryAdmin(admin.ModelAdmin):
|
|||||||
Admin customisation for Entry
|
Admin customisation for Entry
|
||||||
"""
|
"""
|
||||||
list_display = ('note', 'activity', 'time', 'guest')
|
list_display = ('note', 'activity', 'time', 'guest')
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Opener, site=admin_site)
|
|
||||||
class OpenerAdmin(admin.ModelAdmin):
|
|
||||||
"""
|
|
||||||
Admin customisation for Opener
|
|
||||||
"""
|
|
||||||
list_display = ('activity', 'opener')
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* On form submit, add a new opener
|
* On form submit, create a new friendship
|
||||||
*/
|
*/
|
||||||
function form_create_opener (e) {
|
function form_create_opener (e) {
|
||||||
// Do not submit HTML form
|
// Do not submit HTML form
|
||||||
@@ -16,9 +16,9 @@ function form_create_opener (e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an opener between an activity and a user
|
* Create a trust between users
|
||||||
* @param activity:Integer activity id
|
* @param trusting:Integer trusting note id
|
||||||
* @param opener:Integer user note id
|
* @param trusted:Integer trusted note id
|
||||||
*/
|
*/
|
||||||
function create_opener(activity, opener) {
|
function create_opener(activity, opener) {
|
||||||
$.post('/api/activity/opener/', {
|
$.post('/api/activity/opener/', {
|
||||||
@@ -28,15 +28,36 @@ function create_opener(activity, opener) {
|
|||||||
}).done(function () {
|
}).done(function () {
|
||||||
// Reload tables
|
// Reload tables
|
||||||
$('#opener_table').load(location.pathname + ' #opener_table')
|
$('#opener_table').load(location.pathname + ' #opener_table')
|
||||||
addMsg(gettext('Opener successfully added'), 'success')
|
addMsg(gettext('Friendship successfully added'), 'success')
|
||||||
}).fail(function (xhr, _textStatus, _error) {
|
}).fail(function (xhr, _textStatus, _error) {
|
||||||
errMsg(xhr.responseJSON)
|
errMsg(xhr.responseJSON)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On click of "delete", delete the opener
|
* On form submit, create a new friendship
|
||||||
* @param button_id:Integer Opener id to remove
|
function create_opener (e) {
|
||||||
|
// Do not submit HTML form
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
// Get data and send to API
|
||||||
|
const formData = new FormData(e.target)
|
||||||
|
$.post('/api/activity/opener/', {
|
||||||
|
csrfmiddlewaretoken: formData.get('csrfmiddlewaretoken'),
|
||||||
|
activity: formData.get('activity'),
|
||||||
|
opener: formData.get('opener')
|
||||||
|
}).done(function () {
|
||||||
|
// Reload table
|
||||||
|
$('#opener_table').load(location.pathname + ' #opener_table')
|
||||||
|
addMsg(gettext('Alias successfully added'), 'success')
|
||||||
|
}).fail(function (xhr, _textStatus, _error) {
|
||||||
|
errMsg(xhr.responseJSON)
|
||||||
|
})
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On click of "delete", delete the trust
|
||||||
|
* @param button_id:Integer Trust id to remove
|
||||||
*/
|
*/
|
||||||
function delete_button (button_id) {
|
function delete_button (button_id) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -44,7 +65,7 @@ function delete_button (button_id) {
|
|||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
headers: { 'X-CSRFTOKEN': CSRF_TOKEN }
|
headers: { 'X-CSRFTOKEN': CSRF_TOKEN }
|
||||||
}).done(function () {
|
}).done(function () {
|
||||||
addMsg(gettext('Opener successfully deleted'), 'success')
|
addMsg(gettext('Friendship successfully deleted'), 'success')
|
||||||
$('#opener_table').load(location.pathname + ' #opener_table')
|
$('#opener_table').load(location.pathname + ' #opener_table')
|
||||||
}).fail(function (xhr, _textStatus, _error) {
|
}).fail(function (xhr, _textStatus, _error) {
|
||||||
errMsg(xhr.responseJSON)
|
errMsg(xhr.responseJSON)
|
||||||
|
@@ -23,19 +23,19 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
<script>
|
<script>
|
||||||
var date_end = document.getElementById("id_date_end");
|
var date_end = document.getElementById("id_date_end");
|
||||||
var date_start = document.getElementById("id_date_start");
|
var date_start = document.getElementById("id_date_start");
|
||||||
|
|
||||||
function update_date_end (){
|
function update_date_end (){
|
||||||
if(date_end.value=="" || date_end.value<date_start.value){
|
if(date_end.value=="" || date_end.value<date_start.value){
|
||||||
date_end.value = date_start.value;
|
date_end.value = date_start.value;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
function update_date_start (){
|
function update_date_start (){
|
||||||
if(date_start.value=="" || date_end.value<date_start.value){
|
if(date_start.value=="" || date_end.value<date_start.value){
|
||||||
date_start.value = date_end.value;
|
date_start.value = date_end.value;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
date_start.addEventListener('focusout', update_date_end);
|
date_start.addEventListener('focusout', update_date_end);
|
||||||
date_end.addEventListener('focusout', update_date_start);
|
date_end.addEventListener('focusout', update_date_start);
|
||||||
|
|
||||||
|
@@ -18,7 +18,7 @@ from django.views import View
|
|||||||
from django.views.decorators.cache import cache_page
|
from django.views.decorators.cache import cache_page
|
||||||
from django.views.generic import DetailView, TemplateView, UpdateView
|
from django.views.generic import DetailView, TemplateView, UpdateView
|
||||||
from django.views.generic.list import ListView
|
from django.views.generic.list import ListView
|
||||||
from django_tables2.views import MultiTableMixin, SingleTableMixin
|
from django_tables2.views import MultiTableMixin
|
||||||
from api.viewsets import is_regex
|
from api.viewsets import is_regex
|
||||||
from note.models import Alias, NoteSpecial, NoteUser
|
from note.models import Alias, NoteSpecial, NoteUser
|
||||||
from permission.backends import PermissionBackend
|
from permission.backends import PermissionBackend
|
||||||
@@ -64,15 +64,19 @@ class ActivityListView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin
|
|||||||
Displays all Activities, and classify if they are on-going or upcoming ones.
|
Displays all Activities, and classify if they are on-going or upcoming ones.
|
||||||
"""
|
"""
|
||||||
model = Activity
|
model = Activity
|
||||||
tables = [
|
tables = [ActivityTable, ActivityTable]
|
||||||
lambda data: ActivityTable(data, prefix="all-"),
|
|
||||||
lambda data: ActivityTable(data, prefix="upcoming-"),
|
|
||||||
]
|
|
||||||
extra_context = {"title": _("Activities")}
|
extra_context = {"title": _("Activities")}
|
||||||
|
|
||||||
def get_queryset(self, **kwargs):
|
def get_queryset(self, **kwargs):
|
||||||
return super().get_queryset(**kwargs).distinct()
|
return super().get_queryset(**kwargs).distinct()
|
||||||
|
|
||||||
|
def get_tables(self):
|
||||||
|
tables = super().get_tables()
|
||||||
|
|
||||||
|
tables[0].prefix = "all-"
|
||||||
|
tables[1].prefix = "upcoming-"
|
||||||
|
return tables
|
||||||
|
|
||||||
def get_tables_data(self):
|
def get_tables_data(self):
|
||||||
# first table = all activities, second table = upcoming
|
# first table = all activities, second table = upcoming
|
||||||
return [
|
return [
|
||||||
@@ -96,7 +100,7 @@ class ActivityListView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ActivityDetailView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, DetailView):
|
class ActivityDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||||
"""
|
"""
|
||||||
Shows details about one activity. Add guest to context
|
Shows details about one activity. Add guest to context
|
||||||
"""
|
"""
|
||||||
@@ -104,25 +108,16 @@ class ActivityDetailView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMix
|
|||||||
context_object_name = "activity"
|
context_object_name = "activity"
|
||||||
extra_context = {"title": _("Activity detail")}
|
extra_context = {"title": _("Activity detail")}
|
||||||
|
|
||||||
tables = [
|
|
||||||
lambda data: GuestTable(data, prefix="guests-"),
|
|
||||||
lambda data: OpenerTable(data, prefix="opener-"),
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_tables_data(self):
|
|
||||||
return [
|
|
||||||
Guest.objects.filter(activity=self.object)
|
|
||||||
.filter(PermissionBackend.filter_queryset(self.request, Guest, "view")),
|
|
||||||
self.object.opener.filter(activity=self.object)
|
|
||||||
.filter(PermissionBackend.filter_queryset(self.request, Opener, "view")),
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data()
|
context = super().get_context_data()
|
||||||
|
|
||||||
tables = context["tables"]
|
table = GuestTable(data=Guest.objects.filter(activity=self.object)
|
||||||
for name, table in zip(["guests", "opener"], tables):
|
.filter(PermissionBackend.filter_queryset(self.request, Guest, "view")))
|
||||||
context[name] = table
|
context["guests"] = table
|
||||||
|
|
||||||
|
table = OpenerTable(data=self.object.opener.filter(activity=self.object)
|
||||||
|
.filter(PermissionBackend.filter_queryset(self.request, Opener, "view")))
|
||||||
|
context["opener"] = table
|
||||||
|
|
||||||
context["activity_started"] = timezone.now() > timezone.localtime(self.object.date_start)
|
context["activity_started"] = timezone.now() > timezone.localtime(self.object.date_start)
|
||||||
|
|
||||||
@@ -194,14 +189,12 @@ class ActivityInviteView(ProtectQuerysetMixin, ProtectedCreateView):
|
|||||||
return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]})
|
return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]})
|
||||||
|
|
||||||
|
|
||||||
class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView):
|
class ActivityEntryView(LoginRequiredMixin, TemplateView):
|
||||||
"""
|
"""
|
||||||
Manages entry to an activity
|
Manages entry to an activity
|
||||||
"""
|
"""
|
||||||
template_name = "activity/activity_entry.html"
|
template_name = "activity/activity_entry.html"
|
||||||
|
|
||||||
table_class = EntryTable
|
|
||||||
|
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Don't display the entry interface if the user has no right to see it (no right to add an entry for itself),
|
Don't display the entry interface if the user has no right to see it (no right to add an entry for itself),
|
||||||
@@ -297,9 +290,15 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView):
|
|||||||
if settings.DATABASES[note_qs.db]["ENGINE"] == 'django.db.backends.postgresql' else note_qs.distinct()[:20]
|
if settings.DATABASES[note_qs.db]["ENGINE"] == 'django.db.backends.postgresql' else note_qs.distinct()[:20]
|
||||||
return note_qs
|
return note_qs
|
||||||
|
|
||||||
def get_table_data(self):
|
def get_context_data(self, **kwargs):
|
||||||
|
"""
|
||||||
|
Query the list of Guest and Note to the activity and add information to makes entry with JS.
|
||||||
|
"""
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
|
||||||
activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request, Activity, "view"))\
|
activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request, Activity, "view"))\
|
||||||
.distinct().get(pk=self.kwargs["pk"])
|
.distinct().get(pk=self.kwargs["pk"])
|
||||||
|
context["activity"] = activity
|
||||||
|
|
||||||
matched = []
|
matched = []
|
||||||
|
|
||||||
@@ -312,17 +311,8 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView):
|
|||||||
note.activity = activity
|
note.activity = activity
|
||||||
matched.append(note)
|
matched.append(note)
|
||||||
|
|
||||||
return matched
|
table = EntryTable(data=matched)
|
||||||
|
context["table"] = table
|
||||||
def get_context_data(self, **kwargs):
|
|
||||||
"""
|
|
||||||
Query the list of Guest and Note to the activity and add information to makes entry with JS.
|
|
||||||
"""
|
|
||||||
context = super().get_context_data(**kwargs)
|
|
||||||
|
|
||||||
activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request, Activity, "view"))\
|
|
||||||
.distinct().get(pk=self.kwargs["pk"])
|
|
||||||
context["activity"] = activity
|
|
||||||
|
|
||||||
context["entries"] = Entry.objects.filter(activity=activity)
|
context["entries"] = Entry.objects.filter(activity=activity)
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@ from django.utils import timezone
|
|||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.views.generic import DetailView, UpdateView, TemplateView
|
from django.views.generic import DetailView, UpdateView, TemplateView
|
||||||
from django.views.generic.edit import FormMixin
|
from django.views.generic.edit import FormMixin
|
||||||
from django_tables2.views import MultiTableMixin, SingleTableMixin, SingleTableView
|
from django_tables2.views import SingleTableView
|
||||||
from rest_framework.authtoken.models import Token
|
from rest_framework.authtoken.models import Token
|
||||||
from api.viewsets import is_regex
|
from api.viewsets import is_regex
|
||||||
from note.models import Alias, NoteClub, NoteUser, Trust
|
from note.models import Alias, NoteClub, NoteUser, Trust
|
||||||
@@ -248,7 +248,7 @@ class UserListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, DetailView):
|
class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||||
"""
|
"""
|
||||||
View and manage user trust relationships
|
View and manage user trust relationships
|
||||||
"""
|
"""
|
||||||
@@ -257,25 +257,13 @@ class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin
|
|||||||
context_object_name = 'user_object'
|
context_object_name = 'user_object'
|
||||||
extra_context = {"title": _("Note friendships")}
|
extra_context = {"title": _("Note friendships")}
|
||||||
|
|
||||||
tables = [
|
|
||||||
lambda data: TrustTable(data, prefix="trust-"),
|
|
||||||
lambda data: TrustedTable(data, prefix="trusted-"),
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_tables_data(self):
|
|
||||||
note = self.object.note
|
|
||||||
return [
|
|
||||||
note.trusting.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct(),
|
|
||||||
note.trusted.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct(),
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
note = context['object'].note
|
||||||
tables = context["tables"]
|
context["trusting"] = TrustTable(
|
||||||
for name, table in zip(["trusting", "trusted_by"], tables):
|
note.trusting.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct().all())
|
||||||
context[name] = table
|
context["trusted_by"] = TrustedTable(
|
||||||
|
note.trusted.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct().all())
|
||||||
context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_trust", Trust(
|
context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_trust", Trust(
|
||||||
trusting=context["object"].note,
|
trusting=context["object"].note,
|
||||||
trusted=context["object"].note
|
trusted=context["object"].note
|
||||||
@@ -294,7 +282,7 @@ class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ProfileAliasView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixin, DetailView):
|
class ProfileAliasView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||||
"""
|
"""
|
||||||
View and manage user aliases.
|
View and manage user aliases.
|
||||||
"""
|
"""
|
||||||
@@ -303,15 +291,12 @@ class ProfileAliasView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixi
|
|||||||
context_object_name = 'user_object'
|
context_object_name = 'user_object'
|
||||||
extra_context = {"title": _("Note aliases")}
|
extra_context = {"title": _("Note aliases")}
|
||||||
|
|
||||||
table_class = AliasTable
|
|
||||||
context_table_name = "aliases"
|
|
||||||
|
|
||||||
def get_table_data(self):
|
|
||||||
return self.object.note.alias.filter(PermissionBackend.filter_queryset(self.request, Alias, "view")).distinct() \
|
|
||||||
.order_by('normalized_name')
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
note = context['object'].note
|
||||||
|
context["aliases"] = AliasTable(
|
||||||
|
note.alias.filter(PermissionBackend.filter_queryset(self.request, Alias, "view")).distinct()
|
||||||
|
.order_by('normalized_name').all())
|
||||||
context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_alias", Alias(
|
context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_alias", Alias(
|
||||||
note=context["object"].note,
|
note=context["object"].note,
|
||||||
name="",
|
name="",
|
||||||
@@ -535,7 +520,7 @@ class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ClubAliasView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixin, DetailView):
|
class ClubAliasView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||||
"""
|
"""
|
||||||
Manage aliases of a club.
|
Manage aliases of a club.
|
||||||
"""
|
"""
|
||||||
@@ -544,16 +529,11 @@ class ClubAliasView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixin,
|
|||||||
context_object_name = 'club'
|
context_object_name = 'club'
|
||||||
extra_context = {"title": _("Note aliases")}
|
extra_context = {"title": _("Note aliases")}
|
||||||
|
|
||||||
table_class = AliasTable
|
|
||||||
context_table_name = "aliases"
|
|
||||||
|
|
||||||
def get_table_data(self):
|
|
||||||
return self.object.note.alias.filter(
|
|
||||||
PermissionBackend.filter_queryset(self.request, Alias, "view")).distinct()
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
note = context['object'].note
|
||||||
|
context["aliases"] = AliasTable(note.alias.filter(
|
||||||
|
PermissionBackend.filter_queryset(self.request, Alias, "view")).distinct().all())
|
||||||
context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_alias", Alias(
|
context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_alias", Alias(
|
||||||
note=context["object"].note,
|
note=context["object"].note,
|
||||||
name="",
|
name="",
|
||||||
|
@@ -3167,12 +3167,12 @@
|
|||||||
"activity",
|
"activity",
|
||||||
"entry"
|
"entry"
|
||||||
],
|
],
|
||||||
"query": "{\"activity__opener__in\": [\"user\", \"note\", \"activity_responsible\", [\"all\"]]}",
|
"query": "{\"activity__opener__in\": [\"user\", \"note\", \"activity_responsible\", [\"all\"]], \"activity__open\": true, \"activity__activity_type__manage_entries\":true}",
|
||||||
"type": "view",
|
"type": "view",
|
||||||
"mask": 2,
|
"mask": 2,
|
||||||
"field": "",
|
"field": "",
|
||||||
"permanent": false,
|
"permanent": false,
|
||||||
"description": "Voir les entrées des activités dont l'utilisateur⋅rice est ouvreur⋅se"
|
"description": "Voir les entrées des activités ouvertes dont l'utilisateur⋅rice est ouvreur⋅se"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -3183,12 +3183,12 @@
|
|||||||
"activity",
|
"activity",
|
||||||
"guest"
|
"guest"
|
||||||
],
|
],
|
||||||
"query": "{\"activity__opener__in\": [\"user\", \"note\", \"activity_responsible\", [\"all\"]]}",
|
"query": "{\"activity__pk__in\": [\"user\", \"note\", \"activity_responsible\", [\"all\"]], \"activity__open\": true, \"activity__activity_type__manage_entries\":true}",
|
||||||
"type": "view",
|
"type": "view",
|
||||||
"mask": 2,
|
"mask": 2,
|
||||||
"field": "",
|
"field": "",
|
||||||
"permanent": false,
|
"permanent": false,
|
||||||
"description": "Voir les invité⋅es des activités dont l'utilisateur⋅rice est ouvreur⋅se"
|
"description": "Voir les invité⋅es des activités ouvertes dont l'utilisateur⋅rice est ouvreur⋅se"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@@ -12,7 +12,6 @@ from django.forms import HiddenInput
|
|||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.views.generic import UpdateView, TemplateView, CreateView
|
from django.views.generic import UpdateView, TemplateView, CreateView
|
||||||
from django_tables2 import MultiTableMixin
|
|
||||||
from member.models import Membership
|
from member.models import Membership
|
||||||
|
|
||||||
from .backends import PermissionBackend
|
from .backends import PermissionBackend
|
||||||
@@ -106,31 +105,10 @@ class ProtectedCreateView(LoginRequiredMixin, CreateView):
|
|||||||
return super().dispatch(request, *args, **kwargs)
|
return super().dispatch(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class RightsView(MultiTableMixin, TemplateView):
|
class RightsView(TemplateView):
|
||||||
template_name = "permission/all_rights.html"
|
template_name = "permission/all_rights.html"
|
||||||
extra_context = {"title": _("Rights")}
|
extra_context = {"title": _("Rights")}
|
||||||
|
|
||||||
tables = [
|
|
||||||
lambda data: RightsTable(data, prefix="clubs-"),
|
|
||||||
lambda data: SuperuserTable(data, prefix="superusers-"),
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_tables_data(self):
|
|
||||||
special_memberships = Membership.objects.filter(
|
|
||||||
date_start__lte=date.today(),
|
|
||||||
date_end__gte=date.today(),
|
|
||||||
).filter(roles__in=Role.objects.filter((~(Q(name="Adhérent⋅e BDE")
|
|
||||||
| Q(name="Adhérent⋅e Kfet")
|
|
||||||
| Q(name="Membre de club")
|
|
||||||
| Q(name="Bureau de club"))
|
|
||||||
& Q(weirole__isnull=True))))\
|
|
||||||
.order_by("club__name", "user__last_name")\
|
|
||||||
.distinct().all()
|
|
||||||
return [
|
|
||||||
special_memberships,
|
|
||||||
User.objects.filter(is_superuser=True).order_by("last_name"),
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
|
||||||
@@ -148,9 +126,19 @@ class RightsView(MultiTableMixin, TemplateView):
|
|||||||
role.clubs = [membership.club for membership in active_memberships if role in membership.roles.all()]
|
role.clubs = [membership.club for membership in active_memberships if role in membership.roles.all()]
|
||||||
|
|
||||||
if self.request.user.is_authenticated:
|
if self.request.user.is_authenticated:
|
||||||
tables = context["tables"]
|
special_memberships = Membership.objects.filter(
|
||||||
for name, table in zip(["special_memberships_table", "superusers"], tables):
|
date_start__lte=date.today(),
|
||||||
context[name] = table
|
date_end__gte=date.today(),
|
||||||
|
).filter(roles__in=Role.objects.filter((~(Q(name="Adhérent⋅e BDE")
|
||||||
|
| Q(name="Adhérent⋅e Kfet")
|
||||||
|
| Q(name="Membre de club")
|
||||||
|
| Q(name="Bureau de club"))
|
||||||
|
& Q(weirole__isnull=True))))\
|
||||||
|
.order_by("club__name", "user__last_name")\
|
||||||
|
.distinct().all()
|
||||||
|
context["special_memberships_table"] = RightsTable(special_memberships, prefix="clubs-")
|
||||||
|
context["superusers"] = SuperuserTable(User.objects.filter(is_superuser=True).order_by("last_name").all(),
|
||||||
|
prefix="superusers-")
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
@@ -109,7 +109,7 @@
|
|||||||
\renewcommand{\headrulewidth}{0pt}
|
\renewcommand{\headrulewidth}{0pt}
|
||||||
\cfoot{
|
\cfoot{
|
||||||
\small{\MonNom ~--~ \MonAdresseRue ~ \MonAdresseVille ~--~ Téléphone : +33(0)7 78 17 22 34\newline
|
\small{\MonNom ~--~ \MonAdresseRue ~ \MonAdresseVille ~--~ Téléphone : +33(0)7 78 17 22 34\newline
|
||||||
E-mail : tresorerie.bde@lists.crans.org ~--~ Numéro SIRET : 399 485 838 00029
|
Site web : bde.ens-cachan.fr ~--~ E-mail : tresorerie.bde@lists.crans.org \newline Numéro SIRET : 399 485 838 00029
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,7 +19,7 @@ from django.utils.translation import gettext_lazy as _
|
|||||||
from django.views.generic import UpdateView, DetailView
|
from django.views.generic import UpdateView, DetailView
|
||||||
from django.views.generic.base import View, TemplateView
|
from django.views.generic.base import View, TemplateView
|
||||||
from django.views.generic.edit import BaseFormView, DeleteView
|
from django.views.generic.edit import BaseFormView, DeleteView
|
||||||
from django_tables2 import MultiTableMixin, SingleTableMixin, SingleTableView
|
from django_tables2 import SingleTableView
|
||||||
from api.viewsets import is_regex
|
from api.viewsets import is_regex
|
||||||
from note.models import SpecialTransaction, NoteSpecial, Alias
|
from note.models import SpecialTransaction, NoteSpecial, Alias
|
||||||
from note_kfet.settings.base import BASE_DIR
|
from note_kfet.settings.base import BASE_DIR
|
||||||
@@ -252,26 +252,21 @@ class RemittanceCreateView(ProtectQuerysetMixin, ProtectedCreateView):
|
|||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
|
||||||
|
context["table"] = RemittanceTable(
|
||||||
|
data=Remittance.objects.filter(
|
||||||
|
PermissionBackend.filter_queryset(self.request, Remittance, "view")).all())
|
||||||
context["special_transactions"] = SpecialTransactionTable(data=SpecialTransaction.objects.none())
|
context["special_transactions"] = SpecialTransactionTable(data=SpecialTransaction.objects.none())
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class RemittanceListView(LoginRequiredMixin, MultiTableMixin, TemplateView):
|
class RemittanceListView(LoginRequiredMixin, TemplateView):
|
||||||
"""
|
"""
|
||||||
List existing Remittances
|
List existing Remittances
|
||||||
"""
|
"""
|
||||||
template_name = "treasury/remittance_list.html"
|
template_name = "treasury/remittance_list.html"
|
||||||
extra_context = {"title": _("Remittances list")}
|
extra_context = {"title": _("Remittances list")}
|
||||||
|
|
||||||
tables = [
|
|
||||||
lambda data: RemittanceTable(data, prefix="opened-remittances-"),
|
|
||||||
lambda data: RemittanceTable(data, prefix="closed-remittances-"),
|
|
||||||
lambda data: SpecialTransactionTable(data, prefix="no-remittance-", exclude=('remittance_remove', )),
|
|
||||||
lambda data: SpecialTransactionTable(data, prefix="with-remittance-", exclude=('remittance_add', )),
|
|
||||||
]
|
|
||||||
paginate_by = 10 # number of rows in tables
|
|
||||||
|
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
# Check that the user is authenticated
|
# Check that the user is authenticated
|
||||||
if not request.user.is_authenticated:
|
if not request.user.is_authenticated:
|
||||||
@@ -281,37 +276,49 @@ class RemittanceListView(LoginRequiredMixin, MultiTableMixin, TemplateView):
|
|||||||
raise PermissionDenied(_("You are not able to see the treasury interface."))
|
raise PermissionDenied(_("You are not able to see the treasury interface."))
|
||||||
return super().dispatch(request, *args, **kwargs)
|
return super().dispatch(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_tables_data(self):
|
|
||||||
return [
|
|
||||||
Remittance.objects.filter(closed=False).filter(
|
|
||||||
PermissionBackend.filter_queryset(self.request, Remittance, "view")),
|
|
||||||
Remittance.objects.filter(closed=True).filter(
|
|
||||||
PermissionBackend.filter_queryset(self.request, Remittance, "view")),
|
|
||||||
SpecialTransaction.objects.filter(source__in=NoteSpecial.objects.filter(~Q(remittancetype=None)),
|
|
||||||
specialtransactionproxy__remittance=None).filter(
|
|
||||||
PermissionBackend.filter_queryset(self.request, Remittance, "view")),
|
|
||||||
SpecialTransaction.objects.filter(source__in=NoteSpecial.objects.filter(~Q(remittancetype=None)),
|
|
||||||
specialtransactionproxy__remittance__closed=False).filter(
|
|
||||||
PermissionBackend.filter_queryset(self.request, Remittance, "view")),
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
|
||||||
tables = context["tables"]
|
opened_remittances = RemittanceTable(
|
||||||
names = [
|
data=Remittance.objects.filter(closed=False).filter(
|
||||||
"opened_remittances",
|
PermissionBackend.filter_queryset(self.request, Remittance, "view")).all(),
|
||||||
"closed_remittances",
|
prefix="opened-remittances-",
|
||||||
"special_transactions_no_remittance",
|
)
|
||||||
"special_transactions_with_remittance",
|
opened_remittances.paginate(page=self.request.GET.get("opened-remittances-page", 1), per_page=10)
|
||||||
]
|
context["opened_remittances"] = opened_remittances
|
||||||
for name, table in zip(names, tables):
|
|
||||||
context[name] = table
|
closed_remittances = RemittanceTable(
|
||||||
|
data=Remittance.objects.filter(closed=True).filter(
|
||||||
|
PermissionBackend.filter_queryset(self.request, Remittance, "view")).all(),
|
||||||
|
prefix="closed-remittances-",
|
||||||
|
)
|
||||||
|
closed_remittances.paginate(page=self.request.GET.get("closed-remittances-page", 1), per_page=10)
|
||||||
|
context["closed_remittances"] = closed_remittances
|
||||||
|
|
||||||
|
no_remittance_tr = SpecialTransactionTable(
|
||||||
|
data=SpecialTransaction.objects.filter(source__in=NoteSpecial.objects.filter(~Q(remittancetype=None)),
|
||||||
|
specialtransactionproxy__remittance=None).filter(
|
||||||
|
PermissionBackend.filter_queryset(self.request, Remittance, "view")).all(),
|
||||||
|
exclude=('remittance_remove', ),
|
||||||
|
prefix="no-remittance-",
|
||||||
|
)
|
||||||
|
no_remittance_tr.paginate(page=self.request.GET.get("no-remittance-page", 1), per_page=10)
|
||||||
|
context["special_transactions_no_remittance"] = no_remittance_tr
|
||||||
|
|
||||||
|
with_remittance_tr = SpecialTransactionTable(
|
||||||
|
data=SpecialTransaction.objects.filter(source__in=NoteSpecial.objects.filter(~Q(remittancetype=None)),
|
||||||
|
specialtransactionproxy__remittance__closed=False).filter(
|
||||||
|
PermissionBackend.filter_queryset(self.request, Remittance, "view")).all(),
|
||||||
|
exclude=('remittance_add', ),
|
||||||
|
prefix="with-remittance-",
|
||||||
|
)
|
||||||
|
with_remittance_tr.paginate(page=self.request.GET.get("with-remittance-page", 1), per_page=10)
|
||||||
|
context["special_transactions_with_remittance"] = with_remittance_tr
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class RemittanceUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixin, UpdateView):
|
class RemittanceUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
|
||||||
"""
|
"""
|
||||||
Update Remittance
|
Update Remittance
|
||||||
"""
|
"""
|
||||||
@@ -319,18 +326,19 @@ class RemittanceUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTable
|
|||||||
form_class = RemittanceForm
|
form_class = RemittanceForm
|
||||||
extra_context = {"title": _("Update a remittance")}
|
extra_context = {"title": _("Update a remittance")}
|
||||||
|
|
||||||
table_class = SpecialTransactionTable
|
|
||||||
context_table_name = "special_transactions"
|
|
||||||
|
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
return reverse_lazy('treasury:remittance_list')
|
return reverse_lazy('treasury:remittance_list')
|
||||||
|
|
||||||
def get_table_data(self):
|
def get_context_data(self, **kwargs):
|
||||||
return SpecialTransaction.objects.filter(specialtransactionproxy__remittance=self.object).filter(
|
context = super().get_context_data(**kwargs)
|
||||||
PermissionBackend.filter_queryset(self.request, Remittance, "view"))
|
|
||||||
|
|
||||||
def get_table_kwargs(self):
|
data = SpecialTransaction.objects.filter(specialtransactionproxy__remittance=self.object).filter(
|
||||||
return {"exclude": ('remittance_add', 'remittance_remove', ) if self.object.closed else ('remittance_add', )}
|
PermissionBackend.filter_queryset(self.request, Remittance, "view")).all()
|
||||||
|
context["special_transactions"] = SpecialTransactionTable(
|
||||||
|
data=data,
|
||||||
|
exclude=('remittance_add', 'remittance_remove', ) if self.object.closed else ('remittance_add', ))
|
||||||
|
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
class LinkTransactionToRemittanceView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
|
class LinkTransactionToRemittanceView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
|
||||||
|
@@ -22,7 +22,7 @@ from django.views import View
|
|||||||
from django.views.generic import DetailView, UpdateView, RedirectView, TemplateView
|
from django.views.generic import DetailView, UpdateView, RedirectView, TemplateView
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.views.generic.edit import BaseFormView, DeleteView
|
from django.views.generic.edit import BaseFormView, DeleteView
|
||||||
from django_tables2 import SingleTableView, MultiTableMixin
|
from django_tables2 import SingleTableView
|
||||||
from api.viewsets import is_regex
|
from api.viewsets import is_regex
|
||||||
from member.models import Membership, Club
|
from member.models import Membership, Club
|
||||||
from note.models import Transaction, NoteClub, Alias, SpecialTransaction, NoteSpecial
|
from note.models import Transaction, NoteClub, Alias, SpecialTransaction, NoteSpecial
|
||||||
@@ -101,7 +101,7 @@ class WEICreateView(ProtectQuerysetMixin, ProtectedCreateView):
|
|||||||
return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.pk})
|
return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.pk})
|
||||||
|
|
||||||
|
|
||||||
class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, DetailView):
|
class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||||
"""
|
"""
|
||||||
View WEI information
|
View WEI information
|
||||||
"""
|
"""
|
||||||
@@ -109,40 +109,34 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, D
|
|||||||
context_object_name = "club"
|
context_object_name = "club"
|
||||||
extra_context = {"title": _("WEI Detail")}
|
extra_context = {"title": _("WEI Detail")}
|
||||||
|
|
||||||
tables = [
|
|
||||||
lambda data: HistoryTable(data, prefix="history-"),
|
|
||||||
lambda data: WEIMembershipTable(data, prefix="membership-"),
|
|
||||||
lambda data: WEIRegistrationTable(data, prefix="pre-registration-"),
|
|
||||||
lambda data: BusTable(data, prefix="bus-"),
|
|
||||||
]
|
|
||||||
paginate_by = 20 # number of rows in tables
|
|
||||||
|
|
||||||
def get_tables_data(self):
|
|
||||||
club = self.object
|
|
||||||
club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note)) \
|
|
||||||
.filter(PermissionBackend.filter_queryset(self.request, Transaction, "view")) \
|
|
||||||
.order_by('-created_at', '-id')
|
|
||||||
club_member = WEIMembership.objects.filter(
|
|
||||||
club=club,
|
|
||||||
date_end__gte=date.today(),
|
|
||||||
).filter(PermissionBackend.filter_queryset(self.request, WEIMembership, "view"))
|
|
||||||
pre_registrations = WEIRegistration.objects.filter(
|
|
||||||
PermissionBackend.filter_queryset(self.request, WEIRegistration, "view")).filter(
|
|
||||||
membership=None,
|
|
||||||
wei=club
|
|
||||||
)
|
|
||||||
buses = Bus.objects.filter(PermissionBackend.filter_queryset(self.request, Bus, "view")) \
|
|
||||||
.filter(wei=self.object).annotate(count=Count("memberships")).order_by("name")
|
|
||||||
return [club_transactions, club_member, pre_registrations, buses, ]
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
|
||||||
club = context["club"]
|
club = context["club"]
|
||||||
|
|
||||||
tables = context["tables"]
|
club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note)) \
|
||||||
for name, table in zip(["history_list", "member_list", "pre_registrations", "buses"], tables):
|
.filter(PermissionBackend.filter_queryset(self.request, Transaction, "view")) \
|
||||||
context[name] = table
|
.order_by('-created_at', '-id')
|
||||||
|
history_table = HistoryTable(club_transactions, prefix="history-")
|
||||||
|
history_table.paginate(per_page=20, page=self.request.GET.get('history-page', 1))
|
||||||
|
context['history_list'] = history_table
|
||||||
|
|
||||||
|
club_member = WEIMembership.objects.filter(
|
||||||
|
club=club,
|
||||||
|
date_end__gte=date.today(),
|
||||||
|
).filter(PermissionBackend.filter_queryset(self.request, WEIMembership, "view"))
|
||||||
|
membership_table = WEIMembershipTable(data=club_member, prefix="membership-")
|
||||||
|
membership_table.paginate(per_page=20, page=self.request.GET.get('membership-page', 1))
|
||||||
|
context['member_list'] = membership_table
|
||||||
|
|
||||||
|
pre_registrations = WEIRegistration.objects.filter(
|
||||||
|
PermissionBackend.filter_queryset(self.request, WEIRegistration, "view")).filter(
|
||||||
|
membership=None,
|
||||||
|
wei=club
|
||||||
|
)
|
||||||
|
pre_registrations_table = WEIRegistrationTable(data=pre_registrations, prefix="pre-registration-")
|
||||||
|
pre_registrations_table.paginate(per_page=20, page=self.request.GET.get('pre-registration-page', 1))
|
||||||
|
context['pre_registrations'] = pre_registrations_table
|
||||||
|
|
||||||
my_registration = WEIRegistration.objects.filter(wei=club, user=self.request.user)
|
my_registration = WEIRegistration.objects.filter(wei=club, user=self.request.user)
|
||||||
if my_registration.exists():
|
if my_registration.exists():
|
||||||
@@ -151,6 +145,11 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, D
|
|||||||
my_registration = None
|
my_registration = None
|
||||||
context["my_registration"] = my_registration
|
context["my_registration"] = my_registration
|
||||||
|
|
||||||
|
buses = Bus.objects.filter(PermissionBackend.filter_queryset(self.request, Bus, "view")) \
|
||||||
|
.filter(wei=self.object).annotate(count=Count("memberships")).order_by("name")
|
||||||
|
bus_table = BusTable(data=buses, prefix="bus-")
|
||||||
|
context['buses'] = bus_table
|
||||||
|
|
||||||
random_user = User.objects.filter(~Q(wei__wei__in=[club])).first()
|
random_user = User.objects.filter(~Q(wei__wei__in=[club])).first()
|
||||||
|
|
||||||
if random_user is None:
|
if random_user is None:
|
||||||
|
12
docs/faq.rst
12
docs/faq.rst
@@ -177,13 +177,11 @@ Contributeur⋅rices
|
|||||||
|
|
||||||
Liste des contributeur⋅rices majeur⋅es, par ordre alphabétique :
|
Liste des contributeur⋅rices majeur⋅es, par ordre alphabétique :
|
||||||
|
|
||||||
* bleizi
|
* Pierre-André « PAC » COMBY
|
||||||
* erdnaxe
|
* Emmy « ÿnérant » D'ANELLO
|
||||||
* esum
|
* Benjamin « esum » GRAILLOT
|
||||||
* korenst1
|
* Alexandre « erdnaxe » IOOSS
|
||||||
* nicomarg
|
* Nicolas « nicomarg » MARGULIES
|
||||||
* PAC
|
|
||||||
* ÿnérant
|
|
||||||
|
|
||||||
|
|
||||||
Hébergement
|
Hébergement
|
||||||
|
@@ -17,14 +17,6 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
#: apps/member/static/member/js/alias.js:17
|
|
||||||
msgid "Opener successfully added"
|
|
||||||
msgstr "Ouvreureuse ajouté avec succès"
|
|
||||||
|
|
||||||
#: apps/member/static/member/js/alias.js:17
|
|
||||||
msgid "Opener successfully deleted"
|
|
||||||
msgstr "Ouvreureuse supprimé avec succès"
|
|
||||||
|
|
||||||
#: apps/member/static/member/js/alias.js:17
|
#: apps/member/static/member/js/alias.js:17
|
||||||
msgid "Alias successfully added"
|
msgid "Alias successfully added"
|
||||||
msgstr "Alias ajouté avec succès"
|
msgstr "Alias ajouté avec succès"
|
||||||
|
Reference in New Issue
Block a user