[PYTHON] Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Conception du modèle de base de données)

** Ceci est une continuation de Dernière fois (corrigé le 4 avril 2014). ** **

1. Sélection des données nécessaires

Tout d'abord, j'ai réfléchi au type de données dont l'application pourrait avoir besoin. Les informations nécessaires pour réfléchir aux quarts de travail sont probablement divisées en deux types.

Dans chaque cas, il y a des informations de base telles que les noms, des informations personnelles difficiles à exprimer comme des données telles que l'expérience et les compétences du personnel, la carrière passée et la personnalité des utilisateurs, mais ** Pour le moment, les anciennes bases L'information suffit. ** Les informations personnelles comme celles-ci doivent être connues de tout le personnel de l'établissement, je ne pense donc pas qu'il soit nécessaire de les forcer dans les données.

Donc, pour le moment, j'ai essayé de garder les choses aussi simples que possible.

Personnel

utilisateur

Après cela, vous devez enregistrer les données de la planification que vous avez réellement créée.

Programme

De plus, définissez l'administrateur de la table des équipes (éditeur) et le personnel (visionneuse). Ce serait un problème si quiconque y accédait pouvait le consulter et le modifier.

propriétaire

Comme mentionné ci-dessus, je vais le faire comme ça.

2. Définition du modèle

startprojectAprès avoir créé un projet django dansstartappCréez une application avec.

Je pensais qu'une application suffirait, mais je ne l'aimais pas car elle semblait être désordonnée plus tard, alors j'ai décidé de la diviser en premier (comme je pensais plus haut, `` personnel '' , 'guest', 'schedule', 'owner'). Avant de les oublier, ajoutez-les à INSTALLED_APPS dans settings.py et écrivez models.py.

Commençons par le personnel.

staff/models.py

from django.db import models
from django.contrib.auth.models import User
from owner.models import GroupSchedule


class Staff(models.Model):
	groupschedule = models.ForeignKey(GroupSchedule)

	name = models.CharField(max_length=40)

	user = models.OneToOneField(User,null=True,blank=True)

	class Meta:
		unique_together = ( ('name','groupschedule',), )

	def __unicode__(self):
		return self.name

Pour le moment, la seule classe modèle est Staff. 1.groupschedule: Afin de décider à quelle table d'équipe appartient le personnel (afin que le personnel de plusieurs tables d'équipe ne soit pas mélangé), il est lié à un modèle appelé Programme de groupe de l'application propriétaire. J'en parlerai plus tard. 2.name: Comme vous pouvez le voir, c'est le nom du personnel. 3.user: En supposant que le personnel crée un compte, se connecte et navigue, il est possible de l'associer à la classe de modèle intégrée User (y compris le nom, le mot de passe, etc.). Cependant, certaines personnes ne touchent pas l'ordinateur au travail, donc je n'en ai pas fait un élément obligatoire (peut-être vide = True n'est pas nécessaire? Je ne comprends pas la distinction entre nul et vide ici ...). 4.Meta: Vous pouvez ajouter quelque chose comme des paramètres avancés ici. unique_together définit une combinaison de tables que vous ne souhaitez pas dupliquer (il semble que vous puissiez avoir plusieurs combinaisons).

Vient ensuite l'invité.

guest/models.py

from django.db import models
from owner.models import GroupSchedule


class Guest(models.Model):
	groupschedule = models.ForeignKey(GroupSchedule)

	name = models.CharField(max_length=40)

	class Meta:
		unique_together = ( ('name','groupschedule',), )

	def __unicode__(self):
		return self.name

C'est presque la même chose que le personnel. Ceux-ci peuvent être appelés chaque fois que vous souhaitez ajouter une autre application fonctionnelle à votre projet.

** Le tableau qui semble être unique à la page de production par équipes est défini dans le modèle de l'application de planification (il est donc extrêmement abondant jusqu'à présent). ** **

schedule/models.py

from django.db import models
from django.core.validators import MaxValueValidator,MinValueValidator
from owner.models import GroupSchedule
from staff.models import Staff
from guest.models import Guest


#### base classes ####

class Date(models.Model):

	date = models.DateField()

	def strfdate(self):
		return self.date.strftime('%Y/%m/%d,%a')

	class Meta:
		abstract = True	# This class is not make table


class TimeTable(models.Model):
	start = models.TimeField(default='00:00')
	end = models.TimeField(default='00:00')

	def strftimetable(self):
		timef = '%H:%M'
		start,end = self.start,self.end
		return "%s ~ %s" % ( start.strftime(timef),end.strftime(timef) )

	class Meta:
		abstract = True	# This class is not make table


#### main classes ####

###### staff ######
class MonthShift(models.Model):
	year = models.PositiveIntegerField(validators=[MinValueValidator(1),])

	month = models.PositiveIntegerField(validators=[MaxValueValidator(12),MinValueValidator(1),])

	groupschedule = models.ForeignKey(GroupSchedule)

	completed = models.BooleanField(default=False)

	class Meta:
		unique_together = ( ('year','month','groupschedule',), )


class WorkTime(TimeTable):
	groupschedule = models.ForeignKey(GroupSchedule)

	title = models.CharField(max_length=50,unique=True)

	simbol = models.CharField(max_length=5,unique=True)

	def save(self,*args,**kwargs):
		from datetime import time
		if self.start >= self.end:
			WorkTime.objects.create(title=self.title+'2',simbol='-',start=time(0,0),end=self.end)

			self.end = time(23,59)
		super(WorkTime,self).save(*args,**kwargs)

	class Meta:
		unique_together = ( ('groupschedule','title',),('groupschedule','simbol',), )

	def __unicode__(self):
		return self.title


class StaffSchedule(Date):
	staff = models.ForeignKey(Staff,unique_for_date='date')

	worktime = models.ForeignKey(WorkTime)

	leader = models.BooleanField(default=False)

	phoner = models.BooleanField(default=False)

	def __unicode__(self):
		return self.strfdate()


class NgShift(Date):
	staff = models.ForeignKey(Staff,unique_for_date='date')

	ng_shift = models.ManyToManyField(WorkTime)

	def ng_values(self):
		values = self.ng_shift.values_list('title')
		
		return ",".join( reduce( lambda x,y:x + y ,values ) )
	
	def __unicode__(self):
		return self.staff.name


###### guest ######
class GuestSchedule(Date,TimeTable):
	guest = models.ForeignKey(Guest,unique_for_date='date')

	def __unicode__(self):
		return self.strfdate()

«classes de base» sont les classes parentes, ** syncdb ne crée pas de table **. Les «classes principales» sont les classes qui créent réellement la table.

1.MonthShift: Définissez quel groupe, quelle année et quel mois de travail, et s'il est terminé (par exemple, sur la page de modification de l'équipe, si vous appuyez sur le bouton "Terminer", toutes les heures de travail vides seront converties en vacances, Je veux faire comme ça). Pour l'année et le mois, les valeurs maximum et minimum sont définies avec des validateurs. 2.WorkTime: Définissez des modèles d'heures de travail tels que «équipe précoce» et «équipe tardive». Dans mon lieu de travail, ils sont représentés par une seule lettre telle que «○» ou «△», j'ai donc également un élément appelé «simbol». Écrase la méthode intégrée de django save (), et ajoute un processus pour diviser les heures de travail en unités quotidiennes si les heures de travail s'étendent sur deux jours (je veux exprimer "★" pour l'équipe de nuit et "-" pour l'aube. Je vais donc l'enregistrer comme un autre modèle). 3.StaffSchedule: Désigne les nominations du personnel par date. Normalement, lors de la distribution des équipes, nous résumons cela sur une base mensuelle. Autorisez ForeignKey à sélectionner une seule donnée WorkTime. Je l'ai fait parce que la question de savoir s'il s'agit d'un quart de jour ou de nuit était également dans le tableau actuel. 4.NgShift: Vous pouvez sélectionner plusieurs données WorkTime dans ManyToManyField. On a l'impression que vous pouvez vous inscrire si le personnel dit "Cette heure n'est pas possible ce jour-là" (toutes les sélections sont de vrais souhaits de vacances). ng_values est une fonction manuelle qui renvoie les ng_shifts enregistrés sous forme de chaînes séparées par des virgules, mais c'est pour les pages d'administration. 5.GuestSchedule: Il est similaire à StaffSchedule, mais le temps d'utilisation des clients est différent des heures de travail et il semble difficile de le modeler, nous utilisons donc un format de saisie manuelle.

Enfin, les informations destinées à l'administrateur sont résumées dans le propriétaire.

owner/models.py

from django.db import models
from django.contrib.auth.models import User,Group
from django.core.validators import MaxValueValidator,MinValueValidator


class GroupSchedule(models.Model):
	group = models.OneToOneField(Group)

	owner = models.OneToOneField(User)

	start_point = models.PositiveIntegerField(default=1,validators=[MaxValueValidator(31),MinValueValidator(1),])

	def get_calendar(self,year,month):
		from calendar import Calendar

		from datetime import date
		cal_start = date( year,month,self.start_point )
		cal_end = cal_start.replace(month=cal_start.month+1)
		
		this_month = list( Calendar().itermonthdates( year,month ) )
		next_month = list( Calendar().itermonthdates( year,month+1 ) )
		
		wcal = this_month + next_month
		wcal_list = wcal[wcal.index(cal_start):wcal.index(cal_end)]

		return sorted( set(wcal_list),key=wcal_list.index )

	def __unicode__(self):
		return self.group.name

1.GroupSchedule: Vous pouvez décider pour quel groupe il est prévu, qui est le propriétaire et enregistrer le jour du mois à partir duquel vous commencez à start_point (sur votre lieu de travail, cela a légèrement changé du 15 de chaque mois à un mois, vous pouvez donc le définir librement. Je l'ai fait dans une forme que je peux faire). get_calendar est une fonction qui renvoie un ensemble de dates pour un mois à partir du point de départ, mais vous l'appelerez probablement en vue.

Maintenant, je pense que vous avez construit une base de données de base.

La prochaine fois, essayons "Expérience sur la page d'administration".

Recommended Posts

Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Conception du modèle de base de données)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Page de création de décalage)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Introduction)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Traitement d'authentification)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Expérience sur la page d'administration)
Créer une application Todo avec Django ③ Créer une page de liste de tâches
Créez une application Web simple avec Flask
Créer une application Todo avec Django ④ Implémenter la fonction de création de dossier et de tâche
Créer une application Todo avec Django REST Framework + Angular
Essayez de créer une application Todo avec le framework Django REST
Créer une application Todo avec Django ⑤ Créer une fonction d'édition de tâches
Créer une page d'accueil avec django
Créez une API Web capable de fournir des images avec Django
Créer une application Todo avec Django ① Créer un environnement avec Docker
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
Créer une application Web avec Django
Créer un téléchargeur de fichiers avec Django
Créez une application Web qui peut être facilement visualisée avec Plotly Dash
Une série d'ingénieurs d'infrastructure amateurs touchant Django avec Docker (2): création d'un modèle
"Classification des déchets par image!" Journal de création d'application jour3 ~ Application Web avec Django ~
Développement d'une application WEB avec Django [Définition de modèle]
Jouez comme une application Web avec ipywidgets
Créez un modèle pour votre planning Django
Créer une application graphique avec Tkinter de Python
Démonisez une application Web Python avec Supervisor
Création de la première application avec Django startproject
Créer un service Web avec Docker + Flask
J'ai fait une application WEB avec Django
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
Essayez de créer une application Web avec Vue.js et Django (édition Mac) - (1) Construction d'environnement, création d'application
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Tutoriel Django (Créer une application de blog) ① --Préparation, Création de la première page
Comment développer une application de panier avec Django
Développement d'une application WEB avec Django [Création de l'écran d'administration]
Créer un fichier PDF avec une taille de page aléatoire
Créer une page qui se charge indéfiniment avec python
[Python] Créer un environnement de développement Django avec Docker
Créer un environnement de développement Django à l'aide de Doker Toolbox
Créer une nouvelle page en confluence avec Python
Procédure de création d'application multi-plateforme avec kivy
Créez une application Hello World avec un seul fichier avec django
Jusqu'à ce que vous créiez une nouvelle application dans Django
Extraire des données d'une page Web avec Python
Créer une table avec le notebook IPython
Créez une page Web qui exécute un modèle qui augmente la résolution de l'image à l'aide de gradio, ce qui facilite la création d'un écran Web