** Ceci est une continuation de Dernière fois (corrigé le 4 avril 2014). ** **
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.
Après cela, vous devez enregistrer les données de la planification que vous avez réellement créée.
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.
Comme mentionné ci-dessus, je vais le faire comme ça.
startproject
Après avoir créé un projet django dansstartapp
Cré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.