ADD: Models & Admin
This commit is contained in:
parent
5db00f4028
commit
5d6f56e9ec
18
rosmorport_tsts/rosmorport_tsts/admin.py
Normal file
18
rosmorport_tsts/rosmorport_tsts/admin.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from django.contrib import admin
|
||||||
|
from rosmorport_tsts.models import TbPetsClones
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(TbPetsClones)
|
||||||
|
class AdminTbPetsClones(admin.ModelAdmin):
|
||||||
|
search_fields = ['szPetName', 'szPetSerNum', 'szPetOwner']
|
||||||
|
list_display = ['szPetName', 'szPetSerNum', 'szPetOwner', 'szPetPrice', 'dtPetCreate']
|
||||||
|
list_display_links = ('szPetName', 'szPetSerNum')
|
||||||
|
list_filter = ('iPetType', 'iPetSex', 'bPetIsAlive')
|
||||||
|
empty_value_display = '<b style=\'color:red;\'>—//—</b>'
|
||||||
|
actions_on_top = False
|
||||||
|
actions_on_bottom = False
|
||||||
|
|
||||||
|
def has_delete_permission(self, request, obj=None):
|
||||||
|
# запрет кнопки "удалить" в админке
|
||||||
|
return False
|
115
rosmorport_tsts/rosmorport_tsts/models.py
Normal file
115
rosmorport_tsts/rosmorport_tsts/models.py
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from django.db import models
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.utils.timezone import now
|
||||||
|
from rosmorport_tsts.settings import *
|
||||||
|
import pytils
|
||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
class TbPetsClones(models.Model):
|
||||||
|
"""Модель для хранения клонов питомцев"""
|
||||||
|
class PetType(models.IntegerChoices):
|
||||||
|
"""Тип питомца"""
|
||||||
|
DOG = 1, "Собака"
|
||||||
|
CAT = 2, "Кошка"
|
||||||
|
BIR = 3, "Птица"
|
||||||
|
ROD = 4, "Грызун"
|
||||||
|
REP = 5, "Рептилия"
|
||||||
|
OTH = 0, "Неизвестная зверушка"
|
||||||
|
|
||||||
|
class PetSex(models.IntegerChoices):
|
||||||
|
"""Пол питомца"""
|
||||||
|
MA = 1, "Мужской"
|
||||||
|
FE = 2, "Женский"
|
||||||
|
UN = 0, "Неизвестно"
|
||||||
|
|
||||||
|
iPetType = models.SmallIntegerField(
|
||||||
|
default=PetType.OTH,
|
||||||
|
choices=PetType.choices,
|
||||||
|
db_index=True,
|
||||||
|
verbose_name="Тип питомца"
|
||||||
|
)
|
||||||
|
szPetName = models.CharField(
|
||||||
|
max_length=64,
|
||||||
|
verbose_name="Имя образца",
|
||||||
|
help_text='Имя исходного биологического объекта, с которого изготовлен клон'
|
||||||
|
)
|
||||||
|
szPetSerNum = models.CharField(
|
||||||
|
max_length=25,
|
||||||
|
db_index=True,
|
||||||
|
unique=True,
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
verbose_name="Серийный номер клонированного питомца",
|
||||||
|
help_text='Можно не заполнять. Номер будет сгенерирован автоматически'
|
||||||
|
)
|
||||||
|
iPetSex = models.SmallIntegerField(
|
||||||
|
default=PetSex.UN,
|
||||||
|
choices=PetSex.choices,
|
||||||
|
db_index=True,
|
||||||
|
verbose_name="Пол питомца"
|
||||||
|
)
|
||||||
|
bPetIsAlive = models.BooleanField(
|
||||||
|
default=True,
|
||||||
|
db_index=True,
|
||||||
|
verbose_name="Клон жив"
|
||||||
|
)
|
||||||
|
szPetOwner = models.CharField(
|
||||||
|
max_length=64,
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
verbose_name="Владелец клонированного питомца"
|
||||||
|
)
|
||||||
|
szPetPrice = models.DecimalField(
|
||||||
|
max_digits=10,
|
||||||
|
decimal_places=2,
|
||||||
|
default=random.randint(1000, 10000),
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
verbose_name="Цена клонированного питомца"
|
||||||
|
)
|
||||||
|
szPetComment = models.TextField(
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
verbose_name="Комментарии",
|
||||||
|
help_text='Дополнительная информация о клоне'
|
||||||
|
|
||||||
|
)
|
||||||
|
dtPetCreate = models.DateTimeField(
|
||||||
|
auto_now_add=True, # надо указать False при миграции, после вернуть в True
|
||||||
|
# для выполнения миграций нужно добавлять default, а после она не нужна
|
||||||
|
verbose_name="Дата Создания"
|
||||||
|
)
|
||||||
|
dtPetTimeStamp = models.DateTimeField(
|
||||||
|
auto_now=True, # надо указать False при миграции, после вернуть в True
|
||||||
|
# для выполнения миграций нужно добавлять default, а после она не нужна
|
||||||
|
verbose_name="Штамп времени"
|
||||||
|
)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return f"{self.szPetName} - {self.szPetSerNum}"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.__unicode__()
|
||||||
|
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
if not self.pk:
|
||||||
|
# если объект новый, то генерируем серийный номер
|
||||||
|
self.szPetSerNum = (f"{pytils.translit.slugify(self.szPetName)[:3].upper()}"
|
||||||
|
f"-{self.iPetType:02d}"
|
||||||
|
f"-{self.iPetSex:02d}"
|
||||||
|
f"-{now().strftime('%y%m%d-%H%M%S')}"
|
||||||
|
f"_{now().strftime('%f')[0:2]}")
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
def delete(self, *args, **kwargs):
|
||||||
|
# запрет на удаление записи
|
||||||
|
return
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = "Клон питомца"
|
||||||
|
verbose_name_plural = "Клоны питомцев"
|
||||||
|
db_table = "tb_pets_clones"
|
||||||
|
ordering = ["szPetSerNum", "szPetName",]
|
Loading…
Reference in New Issue
Block a user