mirror of https://gitlab.crans.org/bde/nk20
Compare commits
No commits in common. "3a52af33a263b7a647eaef02f823b7071a38e355" and "9a52c81bffb0965f92361d525803ab05e6778e11" have entirely different histories.
3a52af33a2
...
9a52c81bff
|
@ -40,8 +40,8 @@ secrets.py
|
|||
map.json
|
||||
*.log
|
||||
backups/
|
||||
/static/
|
||||
/media/
|
||||
static/
|
||||
media/
|
||||
|
||||
# Virtualenv
|
||||
env/
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
from django.contrib import admin
|
||||
from note_kfet.admin import admin_site
|
||||
|
||||
from .models import Activity, ActivityType, Entry, Guest
|
||||
from .models import Activity, ActivityType, Guest, Entry
|
||||
|
||||
|
||||
@admin.register(Activity, site=admin_site)
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
from rest_framework import serializers
|
||||
|
||||
from ..models import Activity, ActivityType, Entry, Guest, GuestTransaction
|
||||
from ..models import ActivityType, Activity, Guest, Entry, GuestTransaction
|
||||
|
||||
|
||||
class ActivityTypeSerializer(serializers.ModelSerializer):
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from .views import ActivityTypeViewSet, ActivityViewSet, EntryViewSet, GuestViewSet
|
||||
from .views import ActivityTypeViewSet, ActivityViewSet, GuestViewSet, EntryViewSet
|
||||
|
||||
|
||||
def register_activity_urls(router, path):
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from api.viewsets import ReadProtectedModelViewSet
|
||||
from django_filters.rest_framework import DjangoFilterBackend
|
||||
from rest_framework.filters import SearchFilter
|
||||
from api.viewsets import ReadProtectedModelViewSet
|
||||
|
||||
from .serializers import ActivitySerializer, ActivityTypeSerializer, EntrySerializer, GuestSerializer
|
||||
from ..models import Activity, ActivityType, Entry, Guest
|
||||
from .serializers import ActivityTypeSerializer, ActivitySerializer, GuestSerializer, EntrySerializer
|
||||
from ..models import ActivityType, Activity, Guest, Entry
|
||||
|
||||
|
||||
class ActivityTypeViewSet(ReadProtectedModelViewSet):
|
||||
|
|
|
@ -8,8 +8,8 @@ from django.contrib.contenttypes.models import ContentType
|
|||
from django.utils import timezone
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from member.models import Club
|
||||
from note.models import Note, NoteUser
|
||||
from note_kfet.inputs import Autocomplete, DateTimePickerInput
|
||||
from note.models import NoteUser, Note
|
||||
from note_kfet.inputs import DateTimePickerInput, Autocomplete
|
||||
|
||||
from .models import Activity, Guest
|
||||
|
||||
|
|
|
@ -10,8 +10,8 @@ from django.db import models
|
|||
from django.db.models import Q
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from note.models import NoteUser, Transaction
|
||||
from rest_framework.exceptions import ValidationError
|
||||
from note.models import NoteUser, Transaction
|
||||
|
||||
|
||||
class ActivityType(models.Model):
|
||||
|
|
|
@ -7,7 +7,7 @@ import django_tables2 as tables
|
|||
from django_tables2 import A
|
||||
from note.templatetags.pretty_money import pretty_money
|
||||
|
||||
from .models import Activity, Entry, Guest
|
||||
from .models import Activity, Guest, Entry
|
||||
|
||||
|
||||
class ActivityTable(tables.Table):
|
||||
|
|
|
@ -7,16 +7,16 @@ from django.contrib.contenttypes.models import ContentType
|
|||
from django.db.models import F, Q
|
||||
from django.urls import reverse_lazy
|
||||
from django.utils import timezone
|
||||
from django.views.generic import CreateView, DetailView, UpdateView, TemplateView
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views.generic import CreateView, DetailView, TemplateView, UpdateView
|
||||
from django_tables2.views import SingleTableView
|
||||
from note.models import Alias, NoteSpecial, NoteUser
|
||||
from note.models import NoteUser, Alias, NoteSpecial
|
||||
from permission.backends import PermissionBackend
|
||||
from permission.views import ProtectQuerysetMixin
|
||||
|
||||
from .forms import ActivityForm, GuestForm
|
||||
from .models import Activity, Entry, Guest
|
||||
from .tables import ActivityTable, EntryTable, GuestTable
|
||||
from .models import Activity, Guest, Entry
|
||||
from .tables import ActivityTable, GuestTable, EntryTable
|
||||
|
||||
|
||||
class ActivityCreateView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
|
||||
|
|
|
@ -41,10 +41,6 @@ class ProfileForm(forms.ModelForm):
|
|||
|
||||
last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date"))
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields['address'].widget.attrs.update({"placeholder": "4 avenue des Sciences, 91190 GIF-SUR-YVETTE"})
|
||||
|
||||
def save(self, commit=True):
|
||||
if not self.instance.section or (("department" in self.changed_data
|
||||
or "promotion" in self.changed_data) and "section" not in self.changed_data):
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
{% extends "member/noteowner_detail.html" %}
|
||||
|
||||
{# Use a fluid-width container #}
|
||||
{% block containertype %}container-fluid{% endblock %}
|
||||
|
||||
{% block profile_info %}
|
||||
{% include "member/profile_info.html" %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -5,9 +5,6 @@
|
|||
{# Remove page title #}
|
||||
{% block contenttitle %}{% endblock %}
|
||||
|
||||
{# Use a fluid-width container #}
|
||||
{% block containertype %}container-fluid{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<div class="col-sm-5 col-md-4" id="infos_div">
|
||||
|
|
|
@ -22,11 +22,6 @@ class SignUpForm(UserCreationForm):
|
|||
self.fields['email'].required = True
|
||||
self.fields['email'].help_text = _("This address must be valid.")
|
||||
|
||||
# Give some example
|
||||
self.fields['first_name'].widget.attrs.update({"placeholder": "Sacha"})
|
||||
self.fields['last_name'].widget.attrs.update({"placeholder": "Ketchum"})
|
||||
self.fields['email'].widget.attrs.update({"placeholder": "mail@example.com"})
|
||||
|
||||
def clean_username(self):
|
||||
value = self.cleaned_data["username"]
|
||||
if Alias.objects.filter(normalized_name=Alias.normalize(value)).exists():
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
<!-- Icon by Font Awesome, https://fontawesome.com/, Creative Common 4.0 Attribution -->
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lock" class="svg-inline--fa fa-lock fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M400 224h-24v-72C376 68.2 307.8 0 224 0S72 68.2 72 152v72H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48zm-104 0H152v-72c0-39.7 32.3-72 72-72s72 32.3 72 72v72z"></path></svg>
|
Before Width: | Height: | Size: 529 B |
|
@ -1,2 +0,0 @@
|
|||
<!-- Icon by Font Awesome, https://fontawesome.com/, Creative Common 4.0 Attribution -->
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="user" class="svg-inline--fa fa-user fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z"></path></svg>
|
Before Width: | Height: | Size: 573 B |
|
@ -1,14 +0,0 @@
|
|||
/*
|
||||
Add icons to login form
|
||||
Font-Awesome attribution is already done inside SVG files
|
||||
*/
|
||||
|
||||
#login-form input[type="text"] {
|
||||
background: right 1rem top 50% / 5% no-repeat url('fa-user.svg');
|
||||
padding-right: 3rem;
|
||||
}
|
||||
|
||||
#login-form input[type="password"] {
|
||||
background: right 1rem top 50% / 5% no-repeat url('fa-lock.svg');
|
||||
padding-right: 3rem;
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
{% extends "base.html" %}
|
||||
{% comment %}
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
{% endcomment %}
|
||||
{% load i18n crispy_forms_tags %}
|
||||
|
||||
{% block title %}{% trans "Log in" %}{% endblock %}
|
||||
{% block contenttitle %}<h1>{% trans "Log in" %}</h1>{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% if user.is_authenticated %}
|
||||
<p class="errornote">
|
||||
{% blocktrans trimmed with username=request.user.username %}
|
||||
You are authenticated as {{ username }}, but are not authorized to
|
||||
access this page. Would you like to login to a different account,
|
||||
or with a higher permission mask?
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
{% if request.resolver_match.view_name == 'admin:login' %}
|
||||
<div class="alert alert-info">
|
||||
{% blocktrans trimmed %}
|
||||
You must be logged with a staff account with the higher mask to access Django Admin.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
|
||||
{{ form | crispy }}
|
||||
<input type="submit" value="{% trans 'Log in' %}" class="btn btn-primary">
|
||||
<a href="{% url 'password_reset' %}" class="badge badge-light">{% trans 'Forgotten your password or username?' %}</a>
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -4,10 +4,9 @@
|
|||
{% load i18n %}
|
||||
{% block title %}{% trans "Sign up" %}{% endblock %}
|
||||
|
||||
{# Use a fixed-width container #}
|
||||
{% block containertype %}container{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h2>{% trans "Sign up" %}</h2>
|
||||
|
||||
<div class="alert alert-warning">
|
||||
{% blocktrans %}If you already signed up, your registration is taken into account. The BDE must validate your account before your can log in. You have to go to the Kfet and pay the registration fee. You must also validate your email address by following the link you received.{% endblocktrans %}
|
||||
</div>
|
|
@ -1,8 +1,5 @@
|
|||
{% extends "member/noteowner_detail.html" %}
|
||||
|
||||
{# Use a fluid-width container #}
|
||||
{% block containertype %}container-fluid{% endblock %}
|
||||
|
||||
{% block profile_info %}
|
||||
{% include "wei/weiclub_info.html" %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -27,14 +27,13 @@ ALLOWED_HOSTS = [
|
|||
|
||||
INSTALLED_APPS = [
|
||||
# External apps
|
||||
'bootstrap_datepicker_plus',
|
||||
'colorfield',
|
||||
'crispy_forms',
|
||||
'django_htcpcp_tea',
|
||||
'django_tables2',
|
||||
'mailer',
|
||||
'phonenumber_field',
|
||||
'polymorphic',
|
||||
'crispy_forms',
|
||||
'django_tables2',
|
||||
'bootstrap_datepicker_plus',
|
||||
'colorfield',
|
||||
|
||||
# Django contrib
|
||||
'django.contrib.admin',
|
||||
|
@ -75,7 +74,6 @@ MIDDLEWARE = [
|
|||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'django.middleware.locale.LocaleMiddleware',
|
||||
'django.contrib.sites.middleware.CurrentSiteMiddleware',
|
||||
'django_htcpcp_tea.middleware.HTCPCPTeaMiddleware',
|
||||
'note_kfet.middlewares.TurbolinksMiddleware',
|
||||
]
|
||||
|
||||
|
|
|
@ -209,20 +209,18 @@ function autoCompleteNote(field_id, note_list_id, notes, notes_display, alias_pr
|
|||
placement: 'bottom',
|
||||
title: 'Loading...',
|
||||
trigger: 'manual',
|
||||
container: field.parent(),
|
||||
fallbackPlacement: 'clockwise'
|
||||
container: field.parent()
|
||||
});
|
||||
|
||||
let old_pattern = null;
|
||||
|
||||
// Clear search on click
|
||||
field.click(function () {
|
||||
field.tooltip('hide');
|
||||
field.removeClass('is-invalid');
|
||||
field.val("");
|
||||
old_pattern = "";
|
||||
});
|
||||
|
||||
let old_pattern = null;
|
||||
|
||||
// When the user type "Enter", the first alias is clicked
|
||||
field.keypress(function (event) {
|
||||
if (event.originalEvent.charCode === 13 && notes.length > 0) {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
{% endcomment %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ LANGUAGE_CODE|default:"en" }}" class="position-relative h-100">
|
||||
<html lang="en" class="position-relative h-100">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
@ -22,8 +22,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="{% static "favicon/browserconfig.xml" %}">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
{# Disable turbolink cache for some pages #}
|
||||
{% if no_cache %}
|
||||
<meta name="turbolinks-cache-control" content="no-cache">
|
||||
{% endif %}
|
||||
|
@ -74,24 +72,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
.bs-tooltip-bottom .arrow::before {
|
||||
border-bottom-color: rgba(0,0,0,.250);
|
||||
}
|
||||
|
||||
/* Limit fluid container to a max size */
|
||||
.container-fluid {
|
||||
max-width: 1600px;
|
||||
}
|
||||
|
||||
/* Apply Bootstrap table-responsive to all Django tables */
|
||||
.table-container {
|
||||
display: block;
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
</style>
|
||||
|
||||
{% block extracss %}{% endblock %}
|
||||
</head>
|
||||
<body class="d-flex w-100 h-100 flex-column">
|
||||
{% if debug %}<div style="background:#ffeeba;text-align:center">Mode DEBUG activé.</div>{% endif %}
|
||||
<main class="mb-auto">
|
||||
<nav class="navbar navbar-expand-md navbar-light bg-light fixed-navbar shadow-sm">
|
||||
<a class="navbar-brand" href="/">{{ request.site.name }}</a>
|
||||
|
@ -110,7 +96,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
{% endif %}
|
||||
{% if "note.transaction"|not_empty_model_list %}
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" href="{% url 'note:transfer' %}"><i class="fas fa-exchange-alt"></i> {% trans 'Transfer' %} </a>
|
||||
<a class="nav-link" href="{% url 'note:transfer' %}"><i class="fas fa-exchange-alt"></i>{% trans 'Transfer' %} </a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if "auth.user"|model_list_length >= 2 %}
|
||||
|
@ -181,7 +167,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="{% block containertype %}container{% endblock %} my-3">
|
||||
<div class="container-fluid my-3" style="max-width: 1600px;">
|
||||
{% if request.user.is_authenticated and not request.user.profile.email_confirmed %}
|
||||
<div class="alert alert-warning">
|
||||
{% trans "Your e-mail address is not validated. Please check your mail inbox and click on the validation link." %}
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
{% comment %}
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
{% endcomment %}
|
||||
{% load i18n crispy_forms_tags static %}
|
||||
|
||||
{# Change page title without displaying it in header #}
|
||||
{% block title %}{% trans "Log in" %}{% endblock %}
|
||||
{% block contenttitle %}{% endblock %}
|
||||
|
||||
{% block extracss %}
|
||||
<link rel="stylesheet" href="{% static "registration/login.css" %}">
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<main class="card border-dark mx-auto" style="max-width: 30rem;">
|
||||
<h3 class="card-header text-center">
|
||||
{% trans "Log in" %}
|
||||
</h3>
|
||||
<div class="card-body">
|
||||
{% if user.is_authenticated %}
|
||||
<div class="alert alert-warning">
|
||||
{% blocktrans trimmed with username=request.user.username %}
|
||||
You are authenticated as {{ username }}, but are not authorized to
|
||||
access this page. Would you like to login to a different account,
|
||||
or with a higher permission mask?
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if request.resolver_match.view_name == 'admin:login' %}
|
||||
<div class="alert alert-info">
|
||||
{% blocktrans trimmed %}
|
||||
You must be logged with a staff account with the higher mask to access Django Admin.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
|
||||
{{ form | crispy }}
|
||||
<input type="submit" value="{% trans 'Log in' %}" class="btn btn-primary btn-block btn-lg">
|
||||
<a href="{% url 'password_reset' %}" class="badge badge-light">{% trans 'Forgotten your password or username?' %}</a>
|
||||
</form>
|
||||
</div>
|
||||
</main>
|
||||
{% endblock %}
|
|
@ -31,9 +31,6 @@ urlpatterns = [
|
|||
path('accounts/', include('django.contrib.auth.urls')),
|
||||
path('api/', include('api.urls')),
|
||||
path('permission/', include('permission.urls')),
|
||||
|
||||
# Make coffee
|
||||
path('coffee/', include('django_htcpcp_tea.urls')),
|
||||
]
|
||||
|
||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
|
|
@ -7,7 +7,6 @@ django-allauth==0.39.1
|
|||
django-crispy-forms==1.7.2
|
||||
django-extensions==2.1.9
|
||||
django-filter==2.2.0
|
||||
django-htcpcp-tea==0.3.1
|
||||
django-mailer==2.0.1
|
||||
django-phonenumber-field==4.0.0
|
||||
django-polymorphic==2.0.3
|
||||
|
|
Loading…
Reference in New Issue