2019-06-01 20:23:19 +02:00
|
|
|
from django.contrib import admin, messages
|
2020-06-01 13:44:54 +02:00
|
|
|
from django.db.models import Prefetch
|
2021-07-10 12:11:58 +02:00
|
|
|
from import_export import fields, resources
|
2018-05-22 11:10:09 +02:00
|
|
|
from import_export.admin import ExportMixin
|
2021-07-10 12:11:58 +02:00
|
|
|
from import_export.widgets import DecimalWidget, IntegerWidget
|
2018-05-21 19:28:36 +02:00
|
|
|
|
2021-07-10 12:11:58 +02:00
|
|
|
from manuels.models import (
|
|
|
|
Book,
|
|
|
|
CommonSupply,
|
|
|
|
Editor,
|
|
|
|
ISBNError,
|
|
|
|
Level,
|
|
|
|
SuppliesRequirement,
|
|
|
|
Teacher,
|
|
|
|
)
|
2018-05-21 23:12:35 +02:00
|
|
|
|
|
|
|
|
2018-05-22 11:10:09 +02:00
|
|
|
class TeacherResource(resources.ModelResource):
|
|
|
|
class Meta:
|
|
|
|
model = Teacher
|
2021-07-10 12:11:58 +02:00
|
|
|
fields = ("first_name", "last_name", "email", "phone_number")
|
2018-05-22 11:10:09 +02:00
|
|
|
|
|
|
|
|
2018-05-21 23:12:35 +02:00
|
|
|
@admin.register(Teacher)
|
2018-05-22 11:10:09 +02:00
|
|
|
class TeacherAdmin(ExportMixin, admin.ModelAdmin):
|
|
|
|
resource_class = TeacherResource
|
2021-07-10 12:11:58 +02:00
|
|
|
list_display = ["full_name", "email", "phone_number", "has_confirmed_list"]
|
2018-05-21 23:12:35 +02:00
|
|
|
|
2018-05-22 11:10:27 +02:00
|
|
|
def send_link(self, request, queryset):
|
2018-05-22 10:24:21 +02:00
|
|
|
for teacher in queryset:
|
|
|
|
teacher.send_link(request)
|
2021-07-10 12:11:58 +02:00
|
|
|
messages.success(
|
|
|
|
request,
|
|
|
|
f"Le lien a bien été envoyé aux {queryset.count()} coordonateur(s) sélectionné(s).",
|
|
|
|
)
|
2018-05-22 10:24:21 +02:00
|
|
|
|
2021-07-10 12:11:58 +02:00
|
|
|
send_link.short_description = "Envoyer le lien"
|
2018-05-22 10:24:21 +02:00
|
|
|
|
|
|
|
actions = [send_link]
|
|
|
|
|
2018-05-21 23:12:35 +02:00
|
|
|
|
2019-06-28 15:40:21 +02:00
|
|
|
class LevelResource(resources.ModelResource):
|
2021-07-10 12:11:58 +02:00
|
|
|
non_acquired_book_count = fields.Field(
|
|
|
|
attribute="non_acquired_book_count", widget=IntegerWidget()
|
|
|
|
)
|
|
|
|
non_acquired_book_price = fields.Field(
|
|
|
|
attribute="non_acquired_book_price", widget=DecimalWidget()
|
|
|
|
)
|
|
|
|
non_acquired_consumable_count = fields.Field(
|
|
|
|
attribute="non_acquired_consumable_count", widget=IntegerWidget()
|
|
|
|
)
|
|
|
|
non_acquired_consumable_price = fields.Field(
|
|
|
|
attribute="non_acquired_consumable_price", widget=DecimalWidget()
|
|
|
|
)
|
|
|
|
non_acquired_total_price = fields.Field(
|
|
|
|
attribute="non_acquired_total_price", widget=DecimalWidget()
|
|
|
|
)
|
2019-06-28 15:40:21 +02:00
|
|
|
|
2019-06-28 15:08:40 +02:00
|
|
|
class Meta:
|
2019-06-28 15:40:21 +02:00
|
|
|
model = Level
|
|
|
|
fields = (
|
2021-07-10 12:11:58 +02:00
|
|
|
"name",
|
|
|
|
"non_acquired_book_count",
|
|
|
|
"non_acquired_book_price",
|
|
|
|
"non_acquired_consumable_count",
|
|
|
|
"non_acquired_consumable_price",
|
|
|
|
"non_acquired_total_price",
|
2019-06-28 15:40:21 +02:00
|
|
|
)
|
|
|
|
export_order = (
|
2021-07-10 12:11:58 +02:00
|
|
|
"name",
|
|
|
|
"non_acquired_book_count",
|
|
|
|
"non_acquired_book_price",
|
|
|
|
"non_acquired_consumable_count",
|
|
|
|
"non_acquired_consumable_price",
|
|
|
|
"non_acquired_total_price",
|
2019-06-28 15:40:21 +02:00
|
|
|
)
|
2019-06-28 15:08:40 +02:00
|
|
|
|
|
|
|
|
2018-05-21 23:12:35 +02:00
|
|
|
@admin.register(Level)
|
2019-06-28 15:40:21 +02:00
|
|
|
class LevelAdmin(ExportMixin, admin.ModelAdmin):
|
|
|
|
resource_class = LevelResource
|
2019-06-28 15:15:12 +02:00
|
|
|
list_display = [
|
2021-07-10 12:11:58 +02:00
|
|
|
"name",
|
|
|
|
"order",
|
|
|
|
"non_acquired_book_count",
|
|
|
|
"non_acquired_book_price",
|
|
|
|
"non_acquired_consumable_count",
|
|
|
|
"non_acquired_consumable_price",
|
|
|
|
"non_acquired_total_price",
|
2019-06-28 15:15:12 +02:00
|
|
|
]
|
2021-07-10 12:11:58 +02:00
|
|
|
list_editable = ["order"]
|
|
|
|
list_display_links = ["name"]
|
2018-05-21 23:12:35 +02:00
|
|
|
|
2020-06-01 13:44:54 +02:00
|
|
|
def get_queryset(self, request):
|
2021-07-10 12:11:58 +02:00
|
|
|
return (
|
|
|
|
super(LevelAdmin, self)
|
|
|
|
.get_queryset(request)
|
|
|
|
.prefetch_related(Prefetch("book_set", to_attr="prefetched_books"))
|
|
|
|
)
|
2020-06-01 13:44:54 +02:00
|
|
|
|
2019-06-28 15:24:03 +02:00
|
|
|
def non_acquired_book_count(self, obj: Level):
|
2019-06-28 15:40:21 +02:00
|
|
|
return obj.non_acquired_book_count
|
2020-06-01 13:44:54 +02:00
|
|
|
|
2021-07-10 12:11:58 +02:00
|
|
|
non_acquired_book_count.short_description = (
|
|
|
|
"Nombre de livres à acheter (hors consommables)"
|
|
|
|
)
|
2019-06-28 14:47:35 +02:00
|
|
|
|
2019-06-28 15:24:03 +02:00
|
|
|
def non_acquired_book_price(self, obj: Level):
|
2021-07-10 12:11:58 +02:00
|
|
|
return f"{obj.non_acquired_book_price:.2f}€"
|
2020-06-01 13:44:54 +02:00
|
|
|
|
2021-07-10 12:11:58 +02:00
|
|
|
non_acquired_book_price.short_description = (
|
|
|
|
"Coût des livres à acheter (hors consommables)"
|
|
|
|
)
|
2019-06-28 14:47:35 +02:00
|
|
|
|
2019-06-28 15:15:12 +02:00
|
|
|
def non_acquired_consumable_count(self, obj: Level):
|
2019-06-28 15:40:21 +02:00
|
|
|
return obj.non_acquired_consumable_count
|
2020-06-01 13:44:54 +02:00
|
|
|
|
2021-07-10 12:11:58 +02:00
|
|
|
non_acquired_consumable_count.short_description = "Nombre de consommables à acheter"
|
2019-06-28 15:15:12 +02:00
|
|
|
|
|
|
|
def non_acquired_consumable_price(self, obj: Level):
|
2021-07-10 12:11:58 +02:00
|
|
|
return f"{obj.non_acquired_consumable_price:.2f}€"
|
2020-06-01 13:44:54 +02:00
|
|
|
|
2021-07-10 12:11:58 +02:00
|
|
|
non_acquired_consumable_price.short_description = "Coût des consommables à acheter"
|
2019-06-28 15:24:03 +02:00
|
|
|
|
|
|
|
def non_acquired_total_price(self, obj: Level):
|
2021-07-10 12:11:58 +02:00
|
|
|
return f"{obj.non_acquired_total_price:.2f}€"
|
2020-06-01 13:44:54 +02:00
|
|
|
|
2021-07-10 12:11:58 +02:00
|
|
|
non_acquired_total_price.short_description = "Coût total à acheter"
|
2019-06-28 15:15:12 +02:00
|
|
|
|
2018-05-21 23:12:35 +02:00
|
|
|
|
2018-05-22 11:10:09 +02:00
|
|
|
class BookResource(resources.ModelResource):
|
2021-07-10 12:11:58 +02:00
|
|
|
decitre_url = fields.Field(attribute="decitre_url")
|
2020-06-01 13:53:46 +02:00
|
|
|
|
2018-05-22 11:10:09 +02:00
|
|
|
class Meta:
|
|
|
|
model = Book
|
2021-07-10 12:11:58 +02:00
|
|
|
fields = (
|
|
|
|
"title",
|
|
|
|
"authors",
|
|
|
|
"editor__name",
|
|
|
|
"publication_year",
|
|
|
|
"isbn",
|
|
|
|
"comments",
|
|
|
|
"other_editor",
|
|
|
|
"price",
|
|
|
|
"previously_acquired",
|
|
|
|
"teacher__first_name",
|
|
|
|
"teacher__last_name",
|
|
|
|
"level__name",
|
|
|
|
"field",
|
|
|
|
"consumable",
|
|
|
|
"decitre_url",
|
|
|
|
)
|
|
|
|
export_order = (
|
|
|
|
"level__name",
|
|
|
|
"field",
|
|
|
|
"title",
|
|
|
|
"authors",
|
|
|
|
"editor__name",
|
|
|
|
"publication_year",
|
|
|
|
"isbn",
|
|
|
|
"price",
|
|
|
|
"other_editor",
|
|
|
|
"previously_acquired",
|
|
|
|
"teacher__first_name",
|
|
|
|
"teacher__last_name",
|
|
|
|
"comments",
|
|
|
|
"consumable",
|
|
|
|
"decitre_url",
|
|
|
|
)
|
2018-05-22 11:10:09 +02:00
|
|
|
|
|
|
|
|
2018-05-21 23:12:35 +02:00
|
|
|
@admin.register(Book)
|
2018-05-22 11:10:09 +02:00
|
|
|
class BookAdmin(ExportMixin, admin.ModelAdmin):
|
|
|
|
resource_class = BookResource
|
2021-07-10 12:11:58 +02:00
|
|
|
list_display = [
|
|
|
|
"level",
|
|
|
|
"field",
|
|
|
|
"title",
|
|
|
|
"authors",
|
|
|
|
"editor",
|
|
|
|
"other_editor",
|
|
|
|
"publication_year",
|
|
|
|
"isbn",
|
|
|
|
"price",
|
|
|
|
"previously_acquired",
|
|
|
|
"teacher",
|
|
|
|
"done",
|
|
|
|
"consumable",
|
|
|
|
]
|
|
|
|
list_editable = ["done"]
|
|
|
|
list_filter = [
|
|
|
|
"done",
|
|
|
|
"previously_acquired",
|
|
|
|
"consumable",
|
|
|
|
"level",
|
|
|
|
"editor",
|
|
|
|
"teacher",
|
|
|
|
]
|
|
|
|
list_display_links = ["title"]
|
2018-05-22 01:45:55 +02:00
|
|
|
fieldsets = [
|
2021-07-10 12:11:58 +02:00
|
|
|
(
|
|
|
|
"Infos livre",
|
|
|
|
{
|
|
|
|
"fields": (
|
|
|
|
"title",
|
|
|
|
"consumable",
|
|
|
|
"authors",
|
|
|
|
("editor", "other_editor"),
|
|
|
|
"publication_year",
|
|
|
|
"isbn",
|
|
|
|
"created_at",
|
|
|
|
"updated_at",
|
|
|
|
"comments",
|
|
|
|
)
|
|
|
|
},
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"Élève",
|
|
|
|
{
|
|
|
|
"fields": (
|
|
|
|
"price",
|
|
|
|
"previously_acquired",
|
|
|
|
)
|
|
|
|
},
|
|
|
|
),
|
|
|
|
("Coordonnateur", {"fields": ("teacher", "level", "field")}),
|
|
|
|
("Gestion", {"fields": ("done",)}),
|
2018-05-22 01:45:55 +02:00
|
|
|
]
|
2021-07-10 12:11:58 +02:00
|
|
|
readonly_fields = ["created_at", "updated_at"]
|
2018-05-22 01:35:05 +02:00
|
|
|
|
2020-06-01 13:44:54 +02:00
|
|
|
def get_queryset(self, request):
|
2021-07-10 12:11:58 +02:00
|
|
|
return (
|
|
|
|
super(BookAdmin, self)
|
|
|
|
.get_queryset(request)
|
|
|
|
.select_related("editor", "level", "teacher")
|
|
|
|
)
|
2020-06-01 13:44:54 +02:00
|
|
|
|
2019-06-28 16:33:59 +02:00
|
|
|
def update_with_decitre(self, request, queryset):
|
|
|
|
for book in queryset:
|
|
|
|
try:
|
|
|
|
book.update_from_decitre()
|
|
|
|
messages.success(
|
|
|
|
request,
|
2021-07-10 12:11:58 +02:00
|
|
|
f'Mise à jour réussie du livre "{book.title}" ({book.level.name} - {book.field})',
|
2019-06-28 16:33:59 +02:00
|
|
|
)
|
|
|
|
except ISBNError as e:
|
|
|
|
messages.warning(
|
|
|
|
request,
|
2021-07-10 12:11:58 +02:00
|
|
|
f'Erreur lors de la mise à jour du livre "{book.title}" ({book.level.name} - {book.field}) : {e.data.get("error")}',
|
2019-06-28 16:33:59 +02:00
|
|
|
)
|
|
|
|
|
2021-07-10 12:11:58 +02:00
|
|
|
update_with_decitre.short_description = "Mettre à jour avec Decitre"
|
2019-06-28 16:33:59 +02:00
|
|
|
|
2020-06-30 13:00:36 +02:00
|
|
|
def mark_as_done(self, request, queryset):
|
|
|
|
queryset.update(done=True)
|
|
|
|
|
|
|
|
mark_as_done.short_description = "Marquer comme traité"
|
|
|
|
actions = [update_with_decitre, mark_as_done]
|
2019-06-28 16:33:59 +02:00
|
|
|
|
2018-05-22 01:35:05 +02:00
|
|
|
|
|
|
|
@admin.register(Editor)
|
|
|
|
class EditorAdmin(admin.ModelAdmin):
|
|
|
|
pass
|
2018-05-22 10:13:51 +02:00
|
|
|
|
|
|
|
|
2019-06-15 11:18:37 +02:00
|
|
|
@admin.register(CommonSupply)
|
|
|
|
class CommonSupplyAdmin(admin.ModelAdmin):
|
2021-07-10 12:11:58 +02:00
|
|
|
list_display = ["name", "order"]
|
|
|
|
list_display_links = ["name"]
|
|
|
|
list_editable = ["order"]
|
2019-06-15 11:18:37 +02:00
|
|
|
|
|
|
|
|
2018-05-22 11:10:09 +02:00
|
|
|
class SuppliesResource(resources.ModelResource):
|
|
|
|
class Meta:
|
|
|
|
model = SuppliesRequirement
|
2021-07-10 12:11:58 +02:00
|
|
|
fields = (
|
|
|
|
"supplies",
|
|
|
|
"field",
|
|
|
|
"level__name",
|
|
|
|
"teacher__first_name",
|
|
|
|
"teacher__last_name",
|
|
|
|
)
|
|
|
|
export_order = (
|
|
|
|
"level__name",
|
|
|
|
"field",
|
|
|
|
"supplies",
|
|
|
|
"teacher__first_name",
|
|
|
|
"teacher__last_name",
|
|
|
|
)
|
2018-05-22 11:10:09 +02:00
|
|
|
|
|
|
|
|
2018-05-22 10:13:51 +02:00
|
|
|
@admin.register(SuppliesRequirement)
|
2018-05-22 11:10:09 +02:00
|
|
|
class SuppliesRequirementAdmin(ExportMixin, admin.ModelAdmin):
|
|
|
|
resource_class = SuppliesResource
|
2021-07-10 12:11:58 +02:00
|
|
|
list_display = ["id", "teacher", "level", "field", "supplies", "done"]
|
|
|
|
list_editable = ["done"]
|
|
|
|
readonly_fields = ["created_at", "updated_at"]
|
|
|
|
list_filter = ["done", "teacher", "level"]
|
2020-06-01 13:44:54 +02:00
|
|
|
|
|
|
|
def get_queryset(self, request):
|
2021-07-10 12:11:58 +02:00
|
|
|
return (
|
|
|
|
super(SuppliesRequirementAdmin, self)
|
|
|
|
.get_queryset(request)
|
|
|
|
.select_related("level", "teacher")
|
|
|
|
)
|