Jadi, saya cukup baru dalam hal ini dan tidak punya waktu untuk duduk dan melakukan pembelajaran yang benar.

Apa yang saya coba capai pada akhirnya adalah memodifikasi stempel waktu yang awalnya NULL ke waktu saat ini, berdasarkan # karyawan dan area kerja. Ide di balik ini, adalah sistem "check-in/check-out".

Pertama pengguna memasukkan # dan area kerja dan ketika mereka "Masuk", sebuah entri dibuat dalam database dengan #, area kerja, waktu masuk, dan "waktu habis" yang disetel ke NULL. Setelah selesai, mereka baru saja memasukkan # lagi, area kerja, dan "Keluar" dan ini akan mencari entri terakhir dengan NULL di waktu habis, dan # yang sama dan area kerja dan memperbarui waktu habis ke yang baru stempel waktu. Jika ini tidak ada maka itu akan membuat entri baru tetapi memperingatkan pengguna.

forms.py

class WarehouseForm(forms.Form):
    class Meta:
        model = EmployeeWorkAreaLog
        fields = ('employee_number', 'work_area', 'station_number')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['station_number'].queryset = StationNumber.objects.none()

        if 'work_area' in self.data:
            try:
                work_area_id = int(self.data.get('work_area'))
                self.fields['station_number'].queryset = StationNumber.objects.filter(work_area_id=work_area_id).order_by('name')
            except (ValueError, TypeError):
                pass
        elif self.instance.pk:
            self.fields['station_number'].queryset = self.instance.work_area.stations.order_by('name')

models.py

class WorkArea(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class StationNumber(models.Model):
    work_area = models.ForeignKey(WorkArea, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
    employee_number = models.IntegerField(max_length=50, help_text="Employee #", blank=False)
    work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False, help_text="Work Area", related_name="work_area")
    station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, help_text="Station", related_name="stations", blank=True)
    time_in = models.DateTimeField(auto_now_add=True, help_text="Time in", null=True, blank=True)
    time_out = models.DateTimeField(blank=True, help_text="Time out", null=True)

    def __str__(self):
        return self.employee_number

views.py

class EnterExitArea(CreateView):
    model = EmployeeWorkAreaLog
    template_name = "operations/enter_exit_area.html"
    form_class = WarehouseForm


    def form_valid(self, form):
        if 'enter_area' in self.request.POST:
            form.save()
            return HttpResponseRedirect(self.request.path_info)
        elif 'leave_area' in self.request.POST:
            return HttpResponseRedirect(self.request.path_info)


def load_stations(request):
    work_area_id = request.GET.get('work_area')
    stations = StationNumber.objects.filter(work_area_id=work_area_id).order_by('name')
    return render(request, 'operations/station_number_dropdown_options.html', {'stations': stations})
1
Mariana Gomez-Kusnecov 23 Oktober 2019, 15:52

1 menjawab

Jawaban Terbaik

Anda dapat memfilter model EmployeeWorkAreaLog Anda seperti ini:

employee_log = EmployeeWorkAreaLog.objects.filter(employee_number=1234,work_area__name="East_Bay",station_number=1,time_out__isnull=True).first()
if not employee_log:
    # create new entry and alert user
else:
    employee_log.timeout = current_date_time
    employee_log.save()
0
Ayush Bansal 23 Oktober 2019, 19:31