Django

Scheduleトランまでを作成するViewを作成(Total:12day43.0h)

順番に処理を考えていけばシンプル

処理を作っていくときに、ゴールまでの道順は1回は、イメージしてから書きながら微調整をしていく形でいつもやっている。

順番に処理を作成していった

ファイルに記載するのは、なるべく行数を抑えるために分割していっています。
ファイル名は、今後作りながら変更する可能性があるかもしれないけど。

from django.http import response
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.generics import ListAPIView, CreateAPIView, RetrieveUpdateAPIView, RetrieveUpdateDestroyAPIView, UpdateAPIView
from rest_framework.exceptions import PermissionDenied, NotFound
from rest_framework.response import Response
from django.views import View
from ...models import *       
from django.views import View
from ...models import *
from .create import *
from ..dayweek.create import *
from users.views.users import *
from ..schedule.create import *
from ..useryearmonth.create import *
from ..useryearmonth.update import *
from ...serializers.yearmonth import *

class YearMonthAPI(APIView):
    """
    年月API
    """       
   
    def post(self, request, *args, **kwargs):
        '''
        次月の作成し保存する
        '''
        if request.user.is_superuser == True:
            yearmonth = YearMonthCreate.create(request) #年月トラン作成
            yearmonth, start_date, end_date, days = yearmonth, yearmonth.start_date, yearmonth.end_date, yearmonth.days
            DayWeekCreate.create(request, yearmonth, start_date, end_date, days) #日にち曜日トラン作成
            user_list = UsersServiece.get_effect_users(request, start_date, end_date)#期間中の有効な社員を取得する
            user_year_month = UserYearMonthCreate.create(request, yearmonth, user_list)#社員年月トラン作成
            schedule = ScheduleCreate.create(request, yearmonth, user_year_month)#スケジュールトラン作成
            UserYearMonthUpdate.user_year_month_update(request, user_year_month)#月間合計時間更新
            return Response(YearMonthGetAPI(yearmonth))  
        else:
            raise PermissionDenied(
                _('管理者でないので実行できないです。管理者へご連絡ください')
            )
    
class YearMonthGetAPI(ListAPIView):
    serializer_class = YearMonthSerializer
    
    def get_queryset(self):
        year_month_id = self.kwargs['year_month_id']
        queryset = YearMonth.objects.get(year_month_id = year_month_id).all()
        return queryset
from ...models import *
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

class YearMonthCreate:
    """
    年月作成
    """
    def create(self, *args, **kwargs):
        last_yearmonth = YearMonth.objects.order_by('-end_date').first() 
        start_date = last_yearmonth.end_date + timedelta(days=1)
        end_date = last_yearmonth.end_date + relativedelta(months=1)
        days = end_date - start_date + timedelta(days=1)
        days = days.days
        yearmonth = last_yearmonth.year_month
        #文字列に変換
        str_yearmonth = str(yearmonth)
        str_yearmonth = str_yearmonth[4:6]
        if str_yearmonth == '12':
            yearmonth = yearmonth + 100 - 11
        else:
            yearmonth = yearmonth + 1
        new_obj = YearMonth(
            year_month = yearmonth,
            start_date = start_date,
            end_date = end_date,
            days = days,
        )
        new_obj.save()
        return new_obj
    

年月トランが作成できたので、日にち曜日トラン作成

from django.views import View
from ...models import *
from datetime import datetime, date, timedelta

class DayWeekCreate:
    """
    日にち曜日トラン
    """
       
    def create(self, yearmonth, start_date, end_date, days):
        yearmonth, start_date, end_date, days = yearmonth, start_date, end_date, days
        dayweeks = []
        date = start_date
        for i in range(days):
            date = start_date + timedelta(days=i)
            new_obj = DayWeek(
                yearmonth = yearmonth,
                date = date,
                day = int(date.day),
                day_week = date.weekday(),
            )
            dayweeks.append(new_obj)
        DayWeek.objects.bulk_create(dayweeks)

社員年月トラン作成

from ...models import *


class UserYearMonthCreate:
    """
    社員年月トラン作成
    """
    def create(self, yearmonth, user_list):
        user_year_month = []
        for user in user_list:
            new_obj = UserYearMonth(
                year_month = yearmonth,
                user = user,
                min_work_time = user.min_work_time,
            )
            user_year_month.append(new_obj)
        user_year_month = UserYearMonth.objects.bulk_create(user_year_month)
        user_year_month = UserYearMonth.objects.filter(year_month = yearmonth).prefetch_related()
        return user_year_month

スケジュールを基本シフトトランから作成

from ...models import *
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta
from users.views.users import *
from ..baseshift.list import *
from django.views import View

class ScheduleCreate:
    """
    スケジュール作成
    """
    def create(self, yearmonth, user_year_month):
        yearmonth, start_date, end_date, days = yearmonth, yearmonth.start_date, yearmonth.end_date, yearmonth.days
        schedule = []
        for useryearmonth in user_year_month:
            # 基本シフト取得
            user = useryearmonth.user
            base_shift = BaseShiftList.get_base_shift(user)
            # 曜日からスケジュールを作成
            for i in range(days):
                day = start_date + timedelta(days=i)
                if day < user.join_date or day > user.leave_date:
                    #入社前 退社後は「不」にする
                    shift = 2
                else:
                    for baseshift in base_shift:
                        #ユーザーと基本シフトユーザー 曜日と基本シフト曜日が一致
                        if user == baseshift.user and day.weekday() == baseshift.day_week:
                            new_obj = Schedule(
                                user_yearmonth = useryearmonth,
                                date = day,
                                shisetsu1 = baseshift.shisetu,
                                shift1 = baseshift.shift,
                                work_time = baseshift.shift.work_time,
                            )
                            schedule.append(new_obj)
        Schedule.objects.bulk_create(schedule)

社員年月トランの月間労働時間をスケジュールトランから合計時間更新

from ...models import *
from django.db.models import Sum

class UserYearMonthUpdate:
    """
    社員年月トラン更新
    """
    def user_year_month_update(self, user_year_month):
        """
        社員の月間労働時間と有給合計時間を更新する

        Args:
            user_list ([object]): [description]
        """
        useryearmonth = list(user_year_month)
        work_total = Schedule.objects.values('user_yearmonth_id').filter(
            user_yearmonth__in = useryearmonth).annotate(total=Sum('work_time'))
        for worktotal in work_total:
            upd_obj = UserYearMonth.objects.get(user_year_month_id = worktotal.get('user_yearmonth_id'))
            upd_obj.work_time = worktotal.get('work_time')
            upd_obj.save()
ごろう
動作確認しながら実装してたら、トランザクション処理を入れてたからパニクッタ

動かしながらコードを書いていってだんですが、なんで書き込まれないんだーって、1時間ハマってしまいました(笑)
同じ体験した人っているかな(笑)

-Django

© 2022 ごろう@縁紡ぐ