It would be better if the staff could enter the shifts for one month at once. I made it because there was a request.
schedule.views
def kiboubulkcreatefunc(request,year_num,month_num,kojin_num):
if request.method == 'POST':
form = KiboubulkcreateForm(data=request.POST)
current_user = request.user
year, month, kojin = int(year_num), int(month_num), int(kojin_num)
enddate = datetime.date(year,month,20)
startdate = enddate + relativedelta(months=-1)+ timedelta(days=1)
#Delete existing information
KibouShift.objects.filter(date__range=(startdate, enddate), user = current_user).delete()
display = request.POST.getlist('shift_name_1')
new_object_list =[]
for shift in display:
shift = int(shift)
shift = Shift.objects.get(id = shift)
new_object = KibouShift(
date = startdate,
user = current_user,
shift_name_1 = shift,
)
new_object_list.append(new_object)
startdate = startdate + timedelta(days=1)
KibouShift.objects.bulk_create(new_object_list)
return HttpResponseRedirect('/schedule/kiboulist')
else:
form = KiboubulkcreateForm(request.POST or None)
year, month, kojin = int(year_num), int(month_num), int(kojin_num)
enddate = datetime.date(year,month,20)
startdate = enddate + relativedelta(months=-1)
kaisu = enddate - startdate
kaisu = int(kaisu.days)
shutokudate = startdate + timedelta(days=1)
#Create a list of dates and days of the week
hiduke = str(startdate)
date_format = "%Y-%m-%d"
hiduke = dt.strptime(hiduke, date_format)
sakusei_date = hiduke
calender_object = []
for new_shift in range(kaisu):
sakusei_date = sakusei_date + timedelta(days=1)
calender = {'date' : sakusei_date}
calender_object.append(calender)
context = {
'year': year,
'month': month,
'kojin_num': kojin,
'form' : form,
'kaisu' : kaisu,
'calender_object' : calender_object,
}
return render(request,'schedule/kiboushift/monthkojin.html', context)
forms
class KiboubulkcreateForm(forms.Form):
shift_name_1 = forms.ModelChoiceField(queryset=Shift.objects.all(), label='Shift 1')
fields = ('date', 'shift_name_1')
monthkojin.html
{% extends 'accounts/base.html' %} {% load static %} {% block customcss %}
<link rel="stylesheet" href="{% static 'schedule/kiboushift/monthkojin.css' %}"> {% endblock customcss %} {% block header %}
<div class="header">
<div class="cole-md-1">
<a href="{% url 'schedule:KibouList' %}" class="btn-secondary btn active">List of desired shifts</a></p>
{% endblock header %} {% block content %}
<form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}
<table class="table">
<thead>
<tr>
<th>date</th>
<th>Shift name</th>
</tr>
</thead>
<!--date-->
<tbody>
{% for item in calender_object %}
<tr>
<td>
{% if item.date|date:"D" == "soil" %}
<font color="blue">{{ item.date|date:"Y year m month d day" }}</font>
{% elif item.date|date:"D" == "Day" %}
<font color="red">{{ item.date|date:"Y year m month d day" }}</font>
{% else %} {{ item.date|date:"Y year m month d day" }} {% endif %} {% if item.date|date:"D" == "soil" %}
<font color="blue">{{ item.date | date:"l" }}</font>
{% elif item.date|date:"D" == "Day" %}
<font color="red">{{ item.date | date:"l" }}</font>
{% else %} {{ item.date | date:"l" }} {% endif %}
</td>
<td>
{{ form.shift_name_1 }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
<input type="submit" value="Create"> {% endblock content %}
monthkojin.css
.table {
width: auto;
border-collapse: separate;
border-spacing: 0;
}
table th {
text-align: center;
color: white;
background: linear-gradient(#829ebc, #225588);
border-left: 1px solid #3c6690;
border-top: 1px solid #3c6690;
border-bottom: 1px solid #3c6690;
box-shadow: 0px 1px 1px rgba(255, 255, 255, 0.3) inset;
width: auto;
padding: 10px 0;
}
table td {
text-align: center;
border-left: 1px solid #a8b7c5;
border-bottom: 1px solid #a8b7c5;
border-top: none;
box-shadow: 0px -3px 5px 1px #eee inset;
width: auto;
padding: 10px 0;
}
table td:last-child {
border-right: 1px solid #a8b7c5;
}
table tr:last-child td:first-child {
border-radius: 0 0 0 5px;
}
table tr:last-child td:last-child {
border-radius: 0 0 5px 0;
}
You can now enter them all at once. From now on, I thought that I needed a temporary save function, but I would like to ask if there is another request.
Click here for the screen
After registering, it will be reflected in the desired shift list. Individual modifications can be made here.