Ajout de Quill et avancé du dev

This commit is contained in:
Ambulance Clerc
2023-06-01 13:58:45 +02:00
parent b5d76a71a9
commit 99be4cc5b6
15 changed files with 207 additions and 12 deletions

View File

@@ -23,5 +23,5 @@ urlpatterns = [
path('vehicules/', include('vehicles.urls')),
path('caldav/', include('mycaldav.urls')),
#path('collabs_hour/', include('collabs.urls')),
path('tinymce/', include('tinymce.urls')),
path('carnet_rouge/', include('carnet_rouge.urls')),
]

View File

@@ -1,5 +1,6 @@
from django.contrib import admin
from carnet_rouge.models import cr_Category, cr_Message
from django.contrib.auth.models import User
from django.contrib.admin import SimpleListFilter
@@ -47,6 +48,7 @@ class StatusFilter(DefaultListFilter):
def default_value(self):
return 1
@admin.register(cr_Message)
class cr_Message_Admin(admin.ModelAdmin):
class Meta:
verbose_name = 'Message carnet rouge'
@@ -63,16 +65,16 @@ class cr_Message_Admin(admin.ModelAdmin):
obj.sDestUsers += f"{_con}[{usr.id}]"
_con = ";"
obj.sNotReadUsers = obj.sDestUsers
obj.save()
def has_change_permission(self, request, obj=None):
if obj is not None and obj.Author != request.user:
if obj is not None and obj.Author != request.user :
return False
return True
def has_delete_permission(self, request, obj=None):
if obj is not None and obj.Author != request.user:
if obj is not None and obj.Author != request.user and not request.user.is_superuser:
return False
return True
@@ -80,9 +82,11 @@ class cr_Message_Admin(admin.ModelAdmin):
always_show_username = True
list_display = ('id', 'DestGroup', 'sTitle', 'dtCreated', 'sAuthor','bEnabled', 'calc_read_quotas')
list_display = ('id', 'DestGroup', 'sTitle', 'get_dtCreated', 'sAuthor','bEnabled', 'calc_read_quotas')
list_filter = ["sAuthor", StatusFilter]
fields = ["Caterogy", "DestGroup", 'sTitle', "sText", "dtValidityFrom", "dtValidityTo", "bEnabled"]
search_fields = ['sTitle', 'sText']
"""
list_filter = [('dtDate', DateRangeFilter), ('user', admin.RelatedOnlyFieldListFilter),'sBases','type', 'bNoticed']
@@ -96,4 +100,3 @@ class cr_Message_Admin(admin.ModelAdmin):
# Register your models here.
admin.site.register(cr_Category)
admin.site.register(cr_Message, cr_Message_Admin)

7
carnet_rouge/forms.py Normal file
View File

@@ -0,0 +1,7 @@
from django import forms
from carnet_rouge.models import cr_Message
class CrForm(forms.ModelForm):
class Meta:
model = cr_Message
fields = ('sText',)

View File

@@ -3,7 +3,7 @@ from django.db import models
from django.conf import settings
from django.contrib.auth.models import Group
from django.utils import timezone
from tinymce.models import HTMLField
from django_quill.fields import QuillField
from django.dispatch import receiver
from django.db.models.signals import pre_save
@@ -26,10 +26,11 @@ class cr_Category(models.Model):
class cr_Message(models.Model):
Caterogy = models.ForeignKey(cr_Category, on_delete=models.DO_NOTHING, verbose_name="Catégorie")
sDestUsers = models.TextField("Liste des utilisateurs cibles")
sNotReadUsers = models.TextField()
sReadedUsers = models.TextField("Liste des utilisateurs ayant lu", blank=True)
DestGroup = models.ForeignKey(Group, on_delete=models.DO_NOTHING)
sTitle = models.CharField("Titre", max_length=120)
sText = HTMLField("Corps de texte")
sText = QuillField ("Corps de texte")
dtValidityFrom = models.DateField("Validité depuis",default=timezone.now)
dtValidityTo = models.DateField("Validité jusqu'à", blank=True, null=True)
bEnabled = models.BooleanField("Actif", default=True)
@@ -41,6 +42,9 @@ class cr_Message(models.Model):
dtUpdated = models.DateTimeField('date updated', auto_now=True)
dtCreated = models.DateTimeField('date published', auto_now_add=True)
def get_dtCreated(self):
return self.dtCreated.strftime("%d.%b.%Y %H:%M:%S")
def calc_read_quotas(self):
obj = self
n_dest = obj.sDestUsers.count('[')
@@ -49,10 +53,9 @@ class cr_Message(models.Model):
if n_dest == 0:
return "No dest"
print(f"{n_dest}/{n_readed}")
return f"{(n_readed/n_dest)*100}%"
def __str__(self):
return self.sTitle
class Meta:
verbose_name = "message"

12
carnet_rouge/static/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
img {
max-width: 100%;
}
footer {
font-size: 12px;
padding: 10px;
background-color: #eee;
}

View File

@@ -0,0 +1,51 @@
{% load static %}
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<!-- Custom CSS -->
<link rel="stylesheet" href="{% static 'bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'style.css' %}">
<title>django-quill-editor</title>
</head>
<body>
<div id="wrap">
<nav class="navbar navbar-expand navbar-dark bg-primary mb-3 ps-3 pe-3">
<a href="" class="navbar-brand">Intranet Ambulance Clerc</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor01"
aria-controls="navbarColor01"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="w-100">
<ul class="navbar-nav">
<li class="nav-item">
</li>
<li class="nav-item mr-auto">
<a href="{% url 'admin:index' %}" class="nav-link" target="_blank">Administration intranet</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'carnet_rouge:cr_not_read_list' %}" target="_blank">Repository</a>
</li>
</ul>
</div>
</nav>
{% block content %}
{% endblock %}
<footer class="mt-2 text-center">© 2023 <a href="https://ambulance-clerc.ch"
target="_blank">Ambulance Clerc</a></footer>
{% block script %}
{% endblock %}
</div>
</body>
</html>

View File

@@ -0,0 +1,19 @@
{% extends 'base.html' %}
{% block content %}
<div class="container">
<div class="row d-flex align-items-center mb-3">
<div class="col-125 col-md-12 mb-sm-2 mb-xs-2">
<h2 class="mb-0">{% block title %}title{% endblock %}</h2>
</div>
<div class="col-12 col-md-12 col-lg-9">
<div class="d-flex justify-content-end">
</div>
</div>
</div>
{% block cr_content %}
{% endblock %}
</div>
{% endblock %}

View File

@@ -0,0 +1,7 @@
<div class="card">
<div class="card-body">
<div>
{{ obj.sText.html|safe }}
</div>
</div>
</div>

View File

@@ -0,0 +1,6 @@
{% extends 'carnet_rouge/base_cr.html' %}
{% block title %}<h2>Détail du message: {{ object.sTitle }}</h2>{% endblock %}
{% block cr_content %}
{% include 'carnet_rouge/cr_message.html' with obj=object %}
{% endblock %}

View File

@@ -0,0 +1,18 @@
{% extends 'carnet_rouge/base_cr.html' %}
{% block title %}Messages non lus{% endblock %}
{% block cr_content %}
<div class="row">
<div class="col">
{% if object_list %}
{% for obj in object_list %}
{% include 'carnet_rouge/cr_message.html' with obj=obj %}
{% if not forloop.last %}
<hr>{% endif %}
{% endfor %}
{% else %}
<p>There is no post.</p>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{{ form.media }}
</head>
<body>
test
<form action="" method="POST">{% csrf_token %}
{{ form.sText }}
</form>
{{ obj.sText }}
</body>
</html>

20
carnet_rouge/urls.py Normal file
View File

@@ -0,0 +1,20 @@
from django.urls import path
from carnet_rouge import views
app_name = "carnet_rouge"
urlpatterns = [
path('cr', views.model_form_view, name='model_form_view'),
path('view/<int:pk>', views.CrDetailView.as_view(), name='cr_view'),
path('notread', views.CrNotReadView.as_view(), name='cr_not_read_list'),
]

View File

@@ -1,3 +1,29 @@
from django.shortcuts import render
from carnet_rouge.forms import CrForm
from django.views.generic import ListView, UpdateView, DetailView, FormView, CreateView
from carnet_rouge.models import *
def model_form_view(request):
return render(request, "form_view.html", {'form': CrForm()})
class CrDetailView(DetailView):
model = cr_Message
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["test"] = timezone.now()
return context
class CrNotReadView(ListView):
model = cr_Message
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["test"] = timezone.now()
return context
def cr_view(request, id):
print(id)
cr = cr_Message.objects.get(pk=id)
return render(request, "form_view.html", {'form': CrForm(), 'obj': cr})
# Create your views here.

View File

@@ -56,4 +56,4 @@ x-wr-timezone==0.0.5
xhtml2pdf==0.2.7
zopfli==0.1.9
django-autologin
django-tinymce
django-quill-editor