** Dies ist eine Fortsetzung von Letztes Mal (korrigiert am 4. April 2014). ** **.
Zuerst dachte ich darüber nach, welche Art von Daten die App benötigen könnte. Die Informationen, die benötigt werden, um über Schichten nachzudenken, werden wahrscheinlich grob in zwei Typen unterteilt.
In jedem Fall gibt es grundlegende Informationen wie Namen, persönliche Informationen, die schwer auszudrücken sind, wie Daten wie Erfahrung und Fähigkeiten für Mitarbeiter, vergangene Karriere und Persönlichkeit für Benutzer, aber ** Im Moment die früheren Grundlagen Informationen sind genug. ** Persönliche Informationen wie diese sollten allen Mitarbeitern der Einrichtung bekannt sein, daher halte ich es nicht für erforderlich, sie in Daten zu zwingen.
Deshalb habe ich vorerst versucht, es so einfach wie möglich zu halten.
Danach müssen Sie die Daten des tatsächlich erstellten Zeitplans speichern.
Definieren Sie außerdem den Schichttabellenadministrator (Editor) und die Mitarbeiter (Viewer). Es wäre ein Problem, wenn jeder, der darauf zugegriffen hat, es anzeigen und bearbeiten könnte.
Wie oben erwähnt, werde ich es so machen.
startproject
Nach dem Erstellen eines Django-Projekts instartapp
Machen Sie eine App mit.
Ich hatte das Gefühl, dass eine App ausreichen würde, aber ich mochte sie nicht, weil sie später chaotisch zu sein schien, und entschied mich, sie zuerst aufzuteilen (genau wie ich oben dachte, "Mitarbeiter"). , 'Gast', 'Zeitplan', 'Eigentümer'). Fügen Sie sie vor dem Vergessen zu INSTALLED_APPS in settings.py hinzu und schreiben Sie models.py.
Beginnen wir mit dem Personal.
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
Derzeit ist Staff die einzige Modellklasse. 1.groupschedule: Um zu entscheiden, zu welcher Schichttabelle die Mitarbeiter gehören (damit die Mitarbeiter mehrerer Schichttabellen nicht verwechselt werden), wird sie mit einem Modell namens Gruppenzeitplan der Eigentümer-App verknüpft. Ich werde später über den Inhalt sprechen. 2.name: Wie Sie sehen können, ist es der Name des Personals. 3.user: Unter der Annahme, dass die Mitarbeiter ein Konto erstellen und sich anmelden und durchsuchen, ist es möglich, es der integrierten Modellklasse Benutzer (einschließlich Name, Kennwort usw.) zuzuordnen. Einige Leute berühren den Computer bei der Arbeit jedoch nicht, so dass ich ihn nicht zu einem erforderlichen Element gemacht habe (möglicherweise leer = Wahr ist nicht erforderlich? Ich verstehe die Unterscheidung zwischen null und leer hier nicht ...). 4.Meta: Sie können hier so etwas wie erweiterte Einstellungen hinzufügen. unique_together legt eine Kombination von Tabellen fest, die Sie nicht duplizieren möchten (anscheinend können Sie mehrere Kombinationen haben).
Als nächstes ist Gast.
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
Es ist fast das gleiche wie beim Personal. Diese können jedes Mal aufgerufen werden, wenn Sie Ihrem Projekt eine weitere funktionierende App hinzufügen möchten.
** Die Tabelle, die für die Schichtproduktionsseite eindeutig zu sein scheint, ist im Modell der Zeitplan-App definiert (daher ist sie vorerst überwiegend hier). ** **.
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()
'Basisklassen' sind die übergeordneten Klassen, ** syncdb erstellt keine Tabelle **. 'Hauptklassen' sind die Klassen, die die Tabelle tatsächlich erstellen.
1.MonthShift: Definieren Sie, welche Gruppe, welches Jahr und welcher Monat der Schicht und ob sie vollständig ist (wenn Sie beispielsweise auf der Schichtbearbeitungsseite auf die Schaltfläche "Fertig stellen" klicken, werden alle leeren Arbeitsstunden in Feiertage umgewandelt. Ich möchte es so machen). Sowohl für das Jahr als auch für den Monat werden die Maximal- und Minimalwerte mit Validatoren festgelegt. 2.WorkTime: Definieren Sie Arbeitszeitmuster wie "Frühschicht" und "Spätschicht". An meinem Arbeitsplatz werden sie durch einen einzelnen Buchstaben wie "○" oder "△" dargestellt, daher habe ich auch einen Artikel namens "simbol". Durch Überschreiben der in django integrierten Methode save () haben wir einen Prozess hinzugefügt, um die Arbeitsstunden in tägliche Einheiten zu unterteilen, wenn die Arbeitszeit zwei Tage umfasst (ich möchte "★" für die Nachtschicht und "-" für die Morgendämmerung ausdrücken. Also werde ich es als ein anderes Muster registrieren). 3.StaffSchedule: Bedeutet Personaltermine nach Datum. Normalerweise fassen wir dies bei der Verteilung von Schichten monatlich zusammen. Erlauben Sie ForeignKey, nur eine WorkTime-Daten auszuwählen. Ich habe es gemacht, weil der Punkt, ob es sich um eine Tag- oder eine Nachtschicht handelt, auch in der aktuellen Tabelle enthalten war. 4.NgShift: Sie können in ManyToManyField mehrere WorkTime-Daten auswählen. Sie können sich registrieren, wenn das Personal sagt "Diese Zeit ist an diesem Tag nicht möglich" (alle Auswahlen sind echte Urlaubswünsche). ng_values ist eine handgemachte Funktion, die registrierte ng_shifts als durch Kommas getrennte Zeichenfolgen zurückgibt. Dies gilt jedoch für Administrationsseiten. 5.GuestSchedule: Es ähnelt StaffSchedule, aber die Nutzungsdauer der Kunden unterscheidet sich von der Arbeitszeit und es scheint schwierig, sie zu strukturieren. Daher handelt es sich um ein manuelles Eingabeformat.
Schließlich werden die Informationen für den Administrator im Eigentümer zusammengefasst.
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: Sie können entscheiden, für welche Gruppe es geplant ist, wer der Eigentümer ist, und an start_point registrieren, an welchem Tag des Monats Sie beginnen (an Ihrem Arbeitsplatz hat sich der Wert vom 15. eines jeden Monats auf einen Monat geringfügig geändert, sodass Sie ihn frei festlegen können. Ich habe es in eine Form gebracht, die ich machen kann. get_calendar ist eine Funktion, die eine Reihe von Daten für einen Monat ab dem Startpunkt zurückgibt, aber Sie werden sie wahrscheinlich in der Ansicht aufrufen.
Recommended Posts