Я создал инструмент планирования для планирования действий стандартной продолжительности. Общее количество продолжительностей суммируется за неделю и извлекается из цели недельного планирования. Цель еженедельного планирования основана на контракте с недельными часами (см. Model.py). На данный момент я показываю все планы на текущую неделю в таблице в моем шаблоне и вычисляю остаток (цель планирования - запланированный) на основе текущей недели. Я хочу, чтобы пользователь мог переключиться на предыдущую и будущую недели, и я хочу, чтобы запланированный и рассчитанный остаток переключался вместе с ним. Я пытался сделать это через форму (не знаю, как создать для этого правильную форму) и через django_filters. Django_filters работает с таблицей, но не корректирует сумму недельного планирования и остатка на нужную неделю. Также я еще не знаю, как разрешить пользователю выбирать неделю в фильтре.
В основном я хочу, чтобы пользователь делал next_week = current_week + 1 или prev_week = current_week - 1 одним щелчком по кнопке. После щелчка current_week = next / prev_week.
Я новичок в django и кодировании в целом, и я не знаю, как двигаться дальше.
models.py
class PlanningActivity(models.Model):
name = models.CharField(max_length=255)
is_billable = models.BooleanField()
is_auto_realised = models.BooleanField()
strd_duration = models.PositiveIntegerField()
def __str__(self):
return self.name
class Planning(models.Model):
added_by = models.ForeignKey(
User, related_name='planning_activity', on_delete=models.DO_NOTHING
)
activity = models.ForeignKey(
PlanningActivity, on_delete=models.DO_NOTHING
)
date = models.DateField()
note = models.CharField(max_length=255, blank=True)
def __str__(self):
return str(self.id)
class UserContract(models.Model):
assigned_user = models.ForeignKey(
User, on_delete=models.DO_NOTHING
)
organisation = models.CharField(max_length=255)
function = models.CharField(max_length=255)
team = models.CharField(max_length=255)
hrs_per_week = models.PositiveIntegerField()
planning_target = models.PositiveIntegerField()
beginning_date = models.DateField()
ending_date = models.DateField()
@property
def Target(self):
return (self.hrs_per_week * (self.planning_target/100))
def __str__(self):
return str(self.assigned_user)
views.py
def home(request):
current_week = date.today().isocalendar()[1]
next_week = current_week + 1
planning_form = PlanningForm(request.POST)
if request.user.is_authenticated:
planning = Planning.objects.filter(added_by=request.user, date__week=current_week).select_related('activity').order_by('-date')
total_planned_current_week = Planning.objects.filter(added_by=request.user, date__week=current_week).select_related('activity').aggregate(Sum('activity__strd_duration'))['activity__strd_duration__sum']
total_planned = Planning.objects.filter(added_by=request.user).select_related('activity').aggregate(Sum('activity__strd_duration'))['activity__strd_duration__sum']
week_filter = PlanningFilter(request.GET, queryset=planning)
planning = week_filter.qs
contracts = UserContract.objects.filter(assigned_user=request.user)
# TEMP FIX - ONLY 1 CONTRACT ALLOWED FOR NOW - NEED TO SET EXPIRE DATE IN CONTRACT TO SHOW THE VALID CONTRACT
if total_planned == None:
return redirect('/first_planning')
elif total_planned_current_week == None:
total_planned_current_week = 0
for contract in contracts:
remainder = contract.Target - total_planned_current_week
else:
for contract in contracts:
remainder = contract.Target - total_planned_current_week
else:
planning = ''
contracts = ''
total_planned_current_week = 0
remainder = 0
week_filter = ''
if request.method == 'POST':
if planning_form.is_valid():
new_planning = planning_form.save(commit=False)
new_planning.added_by = request.user
new_planning.save()
return redirect('/')
else:
planning_form = PlanningForm()
return render(request, 'home.html', {'planning_form': planning_form, 'planning':planning,
'contracts':contracts, 'total_planned_current_week':total_planned_current_week, 'remainder': remainder, 'week_filter': week_filter})