2

我正在构建一个小型 django 应用程序来管理商店员工名册。员工是自由职业者,他们每周都有几乎固定的时间表,并且可能会在任何工作日/时间要求额外的时间表。

我是 python 和 django 的新手,我正在使用 django 管理员。

当我“手动”添加“Turno”(工作分配,我不确定,它可能是英语中的“Shift”?)时,一切都足够公平(对我来说)。

我需要某种方式通过 django 管理员添加每周固定的 Turnos(一次全部,而不是“手动”一个接一个),例如设置工作日、开始和结束时间以及两(或三个月)个月的停止日期提前...怎么样?

任何形式的帮助都会很棒,我并不是要你们来证明我的职责。

这是我的models.py:

from django.db import models
from django.contrib.auth.models import User
import datetime

class Dia(models.Model):
fecha = models.DateField(unique=True)

    class Meta:
        ordering = ['fecha']

    def __unicode__(self):
        return (self.fecha.strftime('%A %d de %b de \'%y'))

class Turno(models.Model):
    dia = models.ForeignKey(Dia)
    perfil_usuario = models.ForeignKey(User, verbose_name="Usuario")
    comienza = models.TimeField()
    finaliza = models.TimeField()
    comentarios = models.TextField(blank=True, null=True)

    def __unicode__(self):
        return self.dia.fecha.strftime('%A %d de %b de \'%y') + ' - ' + self.perfil_usuario.username

这是我的 admin.py

from roquen.horarios.models import Turno, Dia
from django.contrib.auth.models import User
from django.contrib import admin
from django import forms

admin.site.register(Dia)

class TurnoAdminForm(forms.ModelForm):
    class Meta:
        model = Turno

    def clean_finaliza(self):
        data = self.cleaned_data['finaliza']
        if data <= self.cleaned_data['comienza']:
            raise forms.ValidationError('La hora de fin debe ser posterior a la de comienzo')
        return data

class TurnoAdmin(admin.ModelAdmin):
    form = TurnoAdminForm
    list_display = ['dia', 'perfil_usuario', 'comienza', 'finaliza']

admin.site.register(Turno, TurnoAdmin)
4

1 回答 1

2

你实际上是在问一个数据库架构问题。您当前的解决方案有两个概念:工人和轮班,因此“轮班”是特定日期的时间间隔。该模型不再有效。

要引入计划轮班,您的问题域必须包含“轮班”一词的两个概念,而两者之间的区别对于解决方案至关重要:

  1. “班次”是一周中某一天的时间间隔
  2. “班次实例”是特定日期的时间间隔

因此,通过将“班次”重命名为反映它发生在特定日期的事实来相应地更改您的模型。然后创建一个更通用地反映转变的新模型:它发生在一周中的某一天,而不是任何特定日期。

因此,您的工人可以与一周内发生的某些班次相关联,但可以自由地改变他们的实际班次。要将工作人员分配到特定日期的特定班次,请创建班次实例。

您可能会创建一个流程来定期(每周)循环所有班次并为下一周创建班次实例。

于 2009-11-09T03:04:25.367 回答