Remove note activities

This commit is contained in:
Yohann D'ANELLO 2020-03-31 14:57:44 +02:00
parent 12945945bc
commit dd3b7bd7e5
15 changed files with 16 additions and 470 deletions

View File

@ -7,7 +7,6 @@ from crispy_forms.layout import Layout
from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
from note.models.notes import NoteActivity
from note_kfet.inputs import Autocomplete, AmountInput
from permission.models import PermissionMask
@ -59,28 +58,6 @@ class ClubForm(forms.ModelForm):
}
class NoteActivityForm(forms.ModelForm):
class Meta:
model = NoteActivity
fields = ('note_name', 'club', 'controller', )
widgets = {
"club": Autocomplete(
Club,
attrs={
'api_url': '/api/members/club/',
}
),
"controller": Autocomplete(
User,
attrs={
'api_url': '/api/user/',
'name_field': 'username',
'placeholder': 'Nom ...',
}
)
}
class AddMembersForm(forms.Form):
class Meta:
fields = ('',)

View File

@ -16,14 +16,6 @@ urlpatterns = [
path('club/<int:pk>/update/', views.ClubUpdateView.as_view(), name="club_update"),
path('club/<int:pk>/update_pic/', views.ClubPictureUpdateView.as_view(), name="club_update_pic"),
path('club/<int:pk>/aliases/', views.ClubAliasView.as_view(), name="club_alias"),
path('club/<int:pk>/linked_notes/', views.ClubLinkedNotesView.as_view(),
name="club_linked_note_list"),
path('club/<int:club_pk>/linked_notes/create/', views.ClubLinkedNoteCreateView.as_view(),
name="club_linked_note_create"),
path('club/<int:club_pk>/linked_notes/<int:pk>/', views.ClubLinkedNoteDetailView.as_view(),
name="club_linked_note_detail"),
path('club/<int:club_pk>/linked_notes/<int:pk>/update/', views.ClubLinkedNoteUpdateView.as_view(),
name="club_linked_note_update"),
path('user/', views.UserListView.as_view(), name="user_list"),
path('user/<int:pk>', views.UserDetailView.as_view(), name="user_detail"),

View File

@ -18,15 +18,14 @@ from django_tables2.views import SingleTableView
from rest_framework.authtoken.models import Token
from note.forms import ImageForm
from note.models import Alias, NoteUser
from note.models.notes import NoteActivity
from note.models.transactions import Transaction
from note.tables import HistoryTable, AliasTable, NoteActivityTable
from note.tables import HistoryTable, AliasTable
from permission.backends import PermissionBackend
from permission.views import ProtectQuerysetMixin
from .filters import UserFilter, UserFilterFormHelper
from .forms import SignUpForm, ProfileForm, ClubForm, MembershipForm, MemberFormSet, FormSetHelper, \
CustomAuthenticationForm, NoteActivityForm
CustomAuthenticationForm
from .models import Club, Membership
from .tables import ClubTable, UserTable
@ -357,82 +356,3 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
def form_valid(self, formset):
formset.save()
return super().form_valid(formset)
class ClubLinkedNotesView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
model = NoteActivity
table_class = NoteActivityTable
def get_queryset(self):
return super().get_queryset().filter(club=self.get_object())
def get_object(self):
if hasattr(self, 'object'):
return self.object
self.object = Club.objects.filter(PermissionBackend.filter_queryset(self.request.user, Club, "view"))\
.get(pk=int(self.kwargs["pk"]))
return self.object
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
club = ctx["object"] = ctx["club"] = self.get_object()
empty_note = NoteActivity(note_name="", club=club, controller=self.request.user)
ctx["can_create"] = PermissionBackend().has_perm(self.request.user, "note.add_noteactivity", empty_note)
return ctx
class ClubLinkedNoteCreateView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
model = NoteActivity
form_class = NoteActivityForm
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
club = Club.objects.filter(PermissionBackend.filter_queryset(self.request.user, Club, "view"))\
.get(pk=self.kwargs["club_pk"])
ctx["object"] = ctx["club"] = club
ctx["form"].fields["club"].initial = club
return ctx
def get_success_url(self):
self.object.refresh_from_db()
return reverse_lazy('member:club_linked_note_detail',
kwargs={"club_pk": self.object.club.pk, "pk": self.object.pk})
class ClubLinkedNoteUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
model = NoteActivity
form_class = NoteActivityForm
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["club"] = Club.objects.filter(PermissionBackend.filter_queryset(self.request.user, Club, "view"))\
.get(pk=self.kwargs["club_pk"])
return ctx
def get_success_url(self):
return reverse_lazy('member:club_linked_note_detail',
kwargs={"club_pk": self.object.club.pk, "pk": self.object.pk})
class ClubLinkedNoteDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
model = NoteActivity
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
note = self.get_queryset().filter(pk=self.kwargs["pk"]).get()
transactions = Transaction.objects.filter(Q(source=note) | Q(destination=note))\
.filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view")).order_by("-id")
ctx['history_list'] = HistoryTable(transactions)
ctx["note"] = note
ctx["club"] = note.club
return ctx

View File

@ -6,7 +6,7 @@ from django.utils.translation import gettext_lazy as _
from polymorphic.admin import PolymorphicChildModelAdmin, \
PolymorphicChildModelFilter, PolymorphicParentModelAdmin
from .models.notes import Alias, Note, NoteClub, NoteSpecial, NoteUser, NoteActivity
from .models.notes import Alias, Note, NoteClub, NoteSpecial, NoteUser
from .models.transactions import Transaction, TemplateCategory, TransactionTemplate, \
RecurrentTransaction, MembershipTransaction
@ -24,7 +24,7 @@ class NoteAdmin(PolymorphicParentModelAdmin):
"""
Parent regrouping all note types as children
"""
child_models = (NoteClub, NoteSpecial, NoteUser, NoteActivity)
child_models = (NoteClub, NoteSpecial, NoteUser)
list_filter = (
PolymorphicChildModelFilter,
'is_active',
@ -74,14 +74,6 @@ class NoteSpecialAdmin(PolymorphicChildModelAdmin):
readonly_fields = ('balance',)
@admin.register(NoteActivity)
class NoteActivityAdmin(PolymorphicChildModelAdmin):
"""
Child for a special note, see NoteAdmin
"""
readonly_fields = ('balance',)
@admin.register(NoteUser)
class NoteUserAdmin(PolymorphicChildModelAdmin):
"""

View File

@ -4,7 +4,7 @@
from rest_framework import serializers
from rest_polymorphic.serializers import PolymorphicSerializer
from ..models.notes import Note, NoteClub, NoteSpecial, NoteUser, Alias, NoteActivity
from ..models.notes import Note, NoteClub, NoteSpecial, NoteUser, Alias
from ..models.transactions import TransactionTemplate, Transaction, MembershipTransaction, TemplateCategory, \
RecurrentTransaction, SpecialTransaction
@ -69,22 +69,6 @@ class NoteUserSerializer(serializers.ModelSerializer):
return str(obj)
class NoteActivitySerializer(serializers.ModelSerializer):
"""
REST API Serializer for User's notes.
The djangorestframework plugin will analyse the model `NoteActivity` and parse all fields in the API.
"""
name = serializers.SerializerMethodField()
class Meta:
model = NoteActivity
fields = '__all__'
read_only_fields = ('note', 'user', )
def get_name(self, obj):
return str(obj)
class AliasSerializer(serializers.ModelSerializer):
"""
REST API Serializer for Aliases.
@ -107,7 +91,6 @@ class NotePolymorphicSerializer(PolymorphicSerializer):
NoteUser: NoteUserSerializer,
NoteClub: NoteClubSerializer,
NoteSpecial: NoteSpecialSerializer,
NoteActivity: NoteActivitySerializer,
}
class Meta:

View File

@ -1,13 +1,13 @@
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from .notes import Alias, Note, NoteClub, NoteSpecial, NoteUser, NoteActivity
from .notes import Alias, Note, NoteClub, NoteSpecial, NoteUser
from .transactions import MembershipTransaction, Transaction, \
TemplateCategory, TransactionTemplate, RecurrentTransaction, SpecialTransaction
__all__ = [
# Notes
'Alias', 'Note', 'NoteClub', 'NoteSpecial', 'NoteUser', 'NoteActivity',
'Alias', 'Note', 'NoteClub', 'NoteSpecial', 'NoteUser',
# Transactions
'MembershipTransaction', 'Transaction', 'TemplateCategory', 'TransactionTemplate',
'RecurrentTransaction', 'SpecialTransaction',

View File

@ -4,13 +4,11 @@
import unicodedata
from django.conf import settings
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from django.db import models
from django.utils.translation import gettext_lazy as _
from polymorphic.models import PolymorphicModel
from member.models import Club
"""
Defines each note types
@ -176,40 +174,6 @@ class NoteSpecial(Note):
return self.special_type
class NoteActivity(Note):
"""
A :model:`note.Note` for accounts that are not attached to a user neither to a club,
that only need to store and transfer money (notes for activities, departments, ...)
"""
note_name = models.CharField(
verbose_name=_('name'),
max_length=255,
unique=True,
)
club = models.ForeignKey(
Club,
on_delete=models.PROTECT,
related_name="linked_notes",
verbose_name=_("club"),
)
controller = models.ForeignKey(
User,
on_delete=models.PROTECT,
related_name="+",
verbose_name=_("controller"),
)
class Meta:
verbose_name = _("activity note")
verbose_name_plural = _("activity notes")
def __str__(self):
return self.note_name
class Alias(models.Model):
"""
points toward a :model:`note.NoteUser` or :model;`note.NoteClub` instance.

View File

@ -9,7 +9,7 @@ from django.utils.html import format_html
from django_tables2.utils import A
from django.utils.translation import gettext_lazy as _
from .models.notes import Alias, NoteActivity
from .models.notes import Alias
from .models.transactions import Transaction, TransactionTemplate
from .templatetags.pretty_money import pretty_money
@ -121,24 +121,6 @@ class AliasTable(tables.Table):
attrs={'td': {'class': 'col-sm-1'}})
class NoteActivityTable(tables.Table):
note_name = tables.LinkColumn(
"member:club_linked_note_detail",
args=[A("club.pk"), A("pk")],
)
def render_balance(self, value):
return pretty_money(value)
class Meta:
attrs = {
'class': 'table table-condensed table-striped table-hover'
}
model = NoteActivity
fields = ('note_name', 'balance',)
template_name = 'django_tables2/bootstrap4.html'
class ButtonTable(tables.Table):
class Meta:
attrs = {

View File

@ -5,7 +5,7 @@ from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User, AnonymousUser
from django.contrib.contenttypes.models import ContentType
from django.db.models import Q, F
from note.models import Note, NoteUser, NoteClub, NoteSpecial, NoteActivity
from note.models import Note, NoteUser, NoteClub, NoteSpecial
from note_kfet.middlewares import get_current_session
from member.models import Membership, Club
@ -49,7 +49,6 @@ class PermissionBackend(ModelBackend):
NoteUser=NoteUser,
NoteClub=NoteClub,
NoteSpecial=NoteSpecial,
NoteActivity=NoteActivity,
F=F,
Q=Q
)

View File

@ -176,7 +176,7 @@
"note",
"alias"
],
"query": "[\"OR\", {\"note__in\": [\"NoteUser\", \"objects\", [\"filter\", {\"user__membership__club__name\": \"Kfet\"}], [\"all\"]]}, {\"note__in\": [\"NoteClub\", \"objects\", [\"all\"]]}, {\"note__in\": [\"NoteActivity\", \"objects\", [\"all\"]]}]",
"query": "[\"OR\", {\"note__in\": [\"NoteUser\", \"objects\", [\"filter\", {\"user__membership__club__name\": \"Kfet\"}], [\"all\"]]}, {\"note__in\": [\"NoteClub\", \"objects\", [\"all\"]]}]",
"type": "view",
"mask": 1,
"field": "",
@ -798,96 +798,6 @@
"description": "Update club"
}
},
{
"model": "permission.permission",
"pk": 48,
"fields": {
"model": [
"note",
"noteactivity"
],
"query": "{\"club\": [\"club\"]}",
"type": "change",
"mask": 1,
"field": "",
"description": "Manage notes that are linked to a club"
}
},
{
"model": "permission.permission",
"pk": 49,
"fields": {
"model": [
"note",
"noteactivity"
],
"query": "{\"club\": [\"club\"]}",
"type": "view",
"mask": 1,
"field": "",
"description": "View notes that are linked to a club"
}
},
{
"model": "permission.permission",
"pk": 50,
"fields": {
"model": [
"note",
"transaction"
],
"query": "[\"AND\", [\"OR\", {\"source__noteactivity__controller\": [\"user\"]}, {\"destination__noteactivity__controller\": [\"user\"]}], [\"OR\", {\"amount__lte\": {\"F\": [\"ADD\", [\"F\", \"source__balance\"], 5000]}}, {\"valid\": false}]]",
"type": "add",
"mask": 2,
"field": "",
"description": "Add transactions linked to a noteactivity"
}
},
{
"model": "permission.permission",
"pk": 51,
"fields": {
"model": [
"note",
"transaction"
],
"query": "[\"AND\", [\"OR\", {\"source__noteactivity__controller\": [\"user\"]}, {\"destination__noteactivity__controller\": [\"user\"]}]]",
"type": "view",
"mask": 1,
"field": "",
"description": "View transactions linked to a noteactivity"
}
},
{
"model": "permission.permission",
"pk": 52,
"fields": {
"model": [
"note",
"note"
],
"query": "{\"noteactivity__controller\": [\"user\"]}",
"type": "view",
"mask": 1,
"field": "",
"description": "View note activity"
}
},
{
"model": "permission.permission",
"pk": 53,
"fields": {
"model": [
"note",
"noteactivity"
],
"query": "{\"controller\": [\"user\"]}",
"type": "view",
"mask": 1,
"field": "",
"description": "View note activity"
}
},
{
"model": "permission.rolepermissions",
"pk": 1,
@ -915,6 +825,7 @@
3,
4,
5,
6,
7,
8,
9,
@ -932,11 +843,6 @@
36,
39,
40,
6,
52,
53,
51,
50
]
}
},
@ -947,9 +853,9 @@
"role": 8,
"permissions": [
19,
20,
21,
22,
20
22
]
}
},
@ -997,9 +903,7 @@
"role": 7,
"permissions": [
22,
47,
48,
49
47
]
}
}

View File

@ -456,18 +456,6 @@ msgstr ""
msgid "special notes"
msgstr ""
#: apps/note/models/notes.py:202 templates/note/noteactivity_detail.html:22
msgid "controller"
msgstr ""
#: apps/note/models/notes.py:206
msgid "activity note"
msgstr ""
#: apps/note/models/notes.py:207
msgid "activity notes"
msgstr ""
#: apps/note/models/notes.py:230
msgid "Invalid alias"
msgstr ""
@ -626,7 +614,7 @@ msgstr ""
#: templates/activity/activity_form.html:9
#: templates/activity/activity_invite.html:8
#: templates/django_filters/rest_framework/form.html:5
#: templates/member/club_form.html:9 templates/note/noteactivity_form.html:14
#: templates/member/club_form.html:9
#: templates/treasury/invoice_form.html:46
msgid "Submit"
msgstr ""
@ -903,7 +891,6 @@ msgid "Add member"
msgstr ""
#: templates/member/club_info.html:45 templates/note/conso_form.html:121
#: templates/note/noteactivity_detail.html:31
msgid "Edit"
msgstr ""
@ -932,7 +919,6 @@ msgid "Member of the Club"
msgstr ""
#: templates/member/club_tables.html:22 templates/member/profile_tables.html:22
#: templates/note/noteactivity_detail.html:42
msgid "Transaction history"
msgstr ""
@ -965,7 +951,6 @@ msgid "Change password"
msgstr ""
#: templates/member/profile_info.html:33
#: templates/note/noteactivity_detail.html:25
msgid "balance"
msgstr ""
@ -1014,22 +999,6 @@ msgstr ""
msgid "Recent transactions history"
msgstr ""
#: templates/note/noteactivity_detail.html:15
msgid "Linked note:"
msgstr ""
#: templates/note/noteactivity_detail.html:19
msgid "attached club"
msgstr ""
#: templates/note/noteactivity_list.html:15
msgid "linked notes of club"
msgstr ""
#: templates/note/noteactivity_list.html:24
msgid "Add new note"
msgstr ""
#: templates/note/transaction_form.html:15
msgid "Gift"
msgstr ""

View File

@ -457,18 +457,6 @@ msgstr "note spéciale"
msgid "special notes"
msgstr "notes spéciales"
#: apps/note/models/notes.py:202 templates/note/noteactivity_detail.html:22
msgid "controller"
msgstr "contrôleur"
#: apps/note/models/notes.py:206
msgid "activity note"
msgstr "note d'activité"
#: apps/note/models/notes.py:207
msgid "activity notes"
msgstr "notes d'activité"
#: apps/note/models/notes.py:230
msgid "Invalid alias"
msgstr "Alias invalide"
@ -627,7 +615,7 @@ msgstr "Trésorerie"
#: templates/activity/activity_form.html:9
#: templates/activity/activity_invite.html:8
#: templates/django_filters/rest_framework/form.html:5
#: templates/member/club_form.html:9 templates/note/noteactivity_form.html:14
#: templates/member/club_form.html:9
#: templates/treasury/invoice_form.html:46
msgid "Submit"
msgstr "Envoyer"
@ -906,7 +894,6 @@ msgid "Add member"
msgstr "Ajouter un membre"
#: templates/member/club_info.html:45 templates/note/conso_form.html:121
#: templates/note/noteactivity_detail.html:31
msgid "Edit"
msgstr "Éditer"
@ -935,7 +922,6 @@ msgid "Member of the Club"
msgstr "Membre du club"
#: templates/member/club_tables.html:22 templates/member/profile_tables.html:22
#: templates/note/noteactivity_detail.html:42
msgid "Transaction history"
msgstr "Historique des transactions"
@ -968,7 +954,6 @@ msgid "Change password"
msgstr "Changer le mot de passe"
#: templates/member/profile_info.html:33
#: templates/note/noteactivity_detail.html:25
msgid "balance"
msgstr "solde du compte"
@ -1017,22 +1002,6 @@ msgstr "Consommations doubles"
msgid "Recent transactions history"
msgstr "Historique des transactions récentes"
#: templates/note/noteactivity_detail.html:15
msgid "Linked note:"
msgstr "note attachée :"
#: templates/note/noteactivity_detail.html:19
msgid "attached club"
msgstr "club lié"
#: templates/note/noteactivity_list.html:15
msgid "linked notes of club"
msgstr "Notes liées au club"
#: templates/note/noteactivity_list.html:24
msgid "Add new note"
msgstr "Ajouter une note"
#: templates/note/transaction_form.html:15
msgid "Gift"
msgstr "Don"

View File

@ -1,60 +0,0 @@
{% extends "member/noteowner_detail.html" %}
{% load i18n %}
{% load render_table from django_tables2 %}
{% load pretty_money %}
{% load perms %}
{% block profile_info %}
{% include "member/club_info.html" %}
{% endblock %}
{% block profile_content %}
<div id="activity_info" class="card bg-light shadow">
<div class="card-header text-center">
<h4>{% trans "Linked note:" %} {{ note.note_name }}</h4>
</div>
<div class="card-body" id="profile_infos">
<dl class="row">
<dt class="col-xl-6">{% trans 'attached club'|capfirst %}</dt>
<dd class="col-xl-6"><a href="{% url 'member:club_detail' pk=club.pk %}">{{ club }}</a></dd>
<dt class="col-xl-6">{% trans 'controller'|capfirst %}</dt>
<dd class="col-xl-6"><a href="{% url 'member:user_detail' pk=note.controller.pk %}">{{ note.controller }}</a></dd>
<dt class="col-xl-6">{% trans 'balance'|capfirst %}</dt>
<dd class="col-xl-6">{{ note.balance|pretty_money }}</dd>
</dl>
{% if "change_"|has_perm:note %}
<div class="card-footer text-center">
<a class="btn btn-primary btn-sm my-1" href="{% url 'member:club_linked_note_update' club_pk=club.pk pk=note.pk %}"> {% trans "Edit" %}</a>
</div>
{% endif %}
</div>
<div class="card">
<div class="card-header position-relative" id="historyListHeading">
<a class="btn btn-link stretched-link collapsed font-weight-bold"
data-toggle="collapse" data-target="#historyListCollapse"
aria-expanded="false" aria-controls="historyListCollapse">
<i class="fa fa-euro"></i> {% trans "Transaction history" %}
</a>
</div>
<div id="historyListCollapse" aria-labelledby="historyListHeading" data-parent="#accordionProfile">
<div id="history_list">
{% render_table history_list %}
</div>
</div>
</div>
{% endblock %}
{% block extrajavascript %}
<script>
function refreshHistory() {
$("#history_list").load("{% url 'member:club_linked_note_detail' club_pk=club.pk pk=note.pk %} #history_list");
$("#profile_infos").load("{% url 'member:club_detail' pk=club.pk%} #profile_infos");
}
</script>
{% endblock %}

View File

@ -1,16 +0,0 @@
{% extends "member/noteowner_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block profile_info %}
{% include "member/club_info.html" %}
{% endblock %}
{% block profile_content %}
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-primary" type="submit">{% trans "Submit" %}</button>
</form>
{% endblock %}

View File

@ -1,29 +0,0 @@
{% extends "member/noteowner_detail.html" %}
{% load i18n %}
{% load render_table from django_tables2 %}
{% block profile_info %}
{% include "member/club_info.html" %}
{% endblock %}
{% block profile_content %}
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card card-border shadow">
<div class="card-header text-center">
<h5> {% trans "linked notes of club"|capfirst %} {{ club.name }}</h5>
</div>
<div class="card-body px-0 py-0" id="club_table">
{% render_table table %}
</div>
</div>
{% if can_create %}
<a href="{% url 'member:club_linked_note_create' club_pk=club.pk %}">
<button class="btn btn-primary btn-block">{% trans "Add new note" %}</button>
</a>
{% endif %}
</div>
</div>
{% endblock %}