Răsfoiți Sursa

Trying to get the previous month entries to generate dates for the set month. Currently not working.

Adam Day 4 ani în urmă
părinte
comite
4f603f343f

+ 28 - 0
app/forms.py

@@ -1,6 +1,8 @@
 from django import forms
 from django.core.validators import RegexValidator, MaxLengthValidator, MinLengthValidator, ValidationError
 from . models import Project, Setting
+from calendar import monthrange
+
 
 numeric = RegexValidator(r'^[0-9+]', 'Only numeric characters.')
 time_max_length = MaxLengthValidator(4, 'Length limit exceeds 4 characters.')
@@ -68,6 +70,32 @@ class TimeEntryForm(forms.Form):
                                 widget=forms.Select(attrs={'class': 'form-control form-control-lg'}))
 
 
+class PastTimeEntryForm(forms.Form):
+
+    def __init__(self, *args, **kwargs):
+        self.month = kwargs.pop('month')
+        self.year = kwargs.pop('year')
+        super(PastTimeEntryForm, self).__init__(*args, **kwargs)
+
+    def number_of_days(self):
+        days = []
+        r = monthrange(self.year, self.month)
+        print(r)
+        return days
+
+    number_of_days
+
+    day_of_month = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control form-control-lg'}))
+    project = forms.ModelChoiceField(Project.objects.all(), required=False,
+                                     label="Select a project if applicable (not required)",
+                                     widget=forms.Select(attrs={'class': 'form-control form-control-lg'}))
+
+    hours = forms.ChoiceField(required=True, choices=hours,
+                              widget=forms.Select(attrs={'class': 'form-control form-control-lg'}))
+    minutes = forms.ChoiceField(required=True, choices=minutes,
+                                widget=forms.Select(attrs={'class': 'form-control form-control-lg'}))
+
+
 class SettingsForm(forms.Form):
     max_daily_hours = forms.CharField(
         required=True,

+ 1 - 1
app/templates/forms/timesheet_entry.html

@@ -1,6 +1,6 @@
 {% load crispy_forms_tags %}
 
-<form action="{% url 'timesheet' %}" method="post">
+<form action="{% url 'timesheet' year=current_month.year month=current_month.month %}" method="post">
     <div class="row">
         <div class="col-sm-12 col-md-4">
             {{ form.hours | as_crispy_field }}

+ 20 - 0
app/templates/forms/timesheet_entry_past.html

@@ -0,0 +1,20 @@
+{% load crispy_forms_tags %}
+
+<form action="{% url 'timesheet' year=current_month.year month=current_month.month %}" method="post">
+    <div class="row">
+        <div class="col-sm-12 col-md-3">
+            {{ form.day_of_month | as_crispy_field }}
+        </div>
+        <div class="col-sm-12 col-md-3">
+            {{ form.hours | as_crispy_field }}
+        </div>
+        <div class="col-sm-12 col-md-3">
+            {{ form.minutes | as_crispy_field }}
+        </div>
+        <div class="col-sm-12 col-md-3">
+            <label class="form-label">&nbsp;</label>
+            <input type="submit" value="Submit" class="form-control form-control-lg btn btn-lg btn-dark">
+        </div>
+        {% csrf_token %}
+    </div>
+</form>

+ 1 - 1
app/templates/forms/timesheet_entry_projects.html

@@ -1,6 +1,6 @@
 {% load crispy_forms_tags %}
 
-<form action="{% url 'timesheet' %}" method="post">
+<form action="{% url 'timesheet' year=current_month.year month=current_month.month %}" method="post">
     <div class="row">
         <div class="col-sm-12 col-md-6">
             {{ form.hours | as_crispy_field }}

+ 25 - 0
app/templates/forms/timesheet_entry_projects_past.html

@@ -0,0 +1,25 @@
+{% load crispy_forms_tags %}
+
+<form action="{% url 'timesheet' year=current_month.year month=current_month.month %}" method="post">
+    <div class="row">
+        <div class="col-sm-12 col-md-4">
+            {{ form.day_of_month | as_crispy_field }}
+        </div>
+        <div class="col-sm-12 col-md-4">
+            {{ form.hours | as_crispy_field }}
+        </div>
+        <div class="col-sm-12 col-md-4">
+            {{ form.minutes | as_crispy_field }}
+        </div>
+        <div class="col-sm-12 col-md-6">
+            {{ form.project | as_crispy_field }}
+        </div>
+        <div class="col-sm-12 col-md-6">
+            <label class="form-label">&nbsp;</label>
+            <input type="submit" value="Submit" class="form-control form-control-lg btn btn-lg btn-dark">
+        </div>
+        {% csrf_token %}
+    </div>
+</form>
+
+

+ 64 - 23
app/templates/timesheet.html

@@ -15,37 +15,71 @@
         </div>
     </div>
 
-    {% if max_daily_entries_quota == False %}
-    <div class="row mb-3">
-        <div class="col-12">
-            <div class="card">
-                <div class="card-body">
-                    {% if projects == "True" %}
-                        {% include 'forms/timesheet_entry_projects.html' %}
-                    {% else %}
-                        {% include 'forms/timesheet_entry.html' %}
-                    {% endif %}
-                </div>
-            </div>
+    <div class="row">
+        <div class="col-4">
+            <a class="btn btn-lg btn-light border" href="{% url 'timesheet' year=previous_month.year month=previous_month.month %}"><span class="oi" data-glyph="chevron-left"></span></a>
+        </div>
+        <div class="col-4 text-center">
+            <h1>{{ current_month_name }} {{ current_month.year }}</h1>
+        </div>
+        <div class="col-4 text-end">
+            {% if show_next %}
+                <a class="btn btn-lg btn-light border" href="{% url 'timesheet' year=next_month.year month=next_month.month %}"><span class="oi" data-glyph="chevron-right"></span></a>
+            {% else %}
+                <a class="btn btn-lg btn-light border disabled" disabled="" href="#!"><span class="oi" data-glyph="chevron-right"></span></a>
+            {% endif %}
         </div>
     </div>
-    {% else %}
-    <div class="row mb-3">
-        <div class="col-12">
-            <div class="card">
-                <div class="card-body text-center">
-                    <p class="lead pt-1"><span class="oi" data-glyph="warning"></span> Maximum daily entries met.</p>
+    {% if show_form %}
+        {% if today_is_today %}
+            {% if max_daily_entries_quota == False %}
+            <div class="row mb-3">
+                <div class="col-12">
+                    <div class="card">
+                        <div class="card-body">
+                            {% if projects == "True" %}
+                                {% include 'forms/timesheet_entry_projects.html' %}
+                            {% else %}
+                                {% include 'forms/timesheet_entry.html' %}
+                            {% endif %}
+                        </div>
+                    </div>
                 </div>
             </div>
-        </div>
-    </div>
+            {% else %}
+            <div class="row mb-3">
+                <div class="col-12">
+                    <div class="card">
+                        <div class="card-body text-center">
+                            <p class="lead pt-1"><span class="oi" data-glyph="warning"></span> Maximum daily entries met.</p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            {% endif %}
+        {% else %}
+            <div class="row mb-3">
+                <div class="col-12">
+                    <div class="card">
+                        <div class="card-body">
+                            {% if projects == "True" %}
+                                {% include 'forms/timesheet_entry_projects_past.html' %}
+                            {% else %}
+                                {% include 'forms/timesheet_entry_past.html' %}
+                            {% endif %}
+                        </div>
+                    </div>
+                </div>
+            </div>
+        {% endif %}
     {% endif %}
 
-    {% if entries %}
+
     <div class="row">
         <div class="col-12">
             <div class="card">
                 <div class="card-body">
+                    {% if entries %}
                     <div class="row mb-3 border-bottom">
                         <div class="col-sm-6">
                             <h3>Total Time Worked: {{ total_time_worked }}</h3>
@@ -54,7 +88,7 @@
 
                         </div>
                         <div class="col-sm-3 text-end">
-                            <a href="#!" class="btn btn-dark"><span class="oi" data-glyph="print"></span></a>
+                            <a href="#!" class="btn btn-lg btn-dark"><span class="oi" data-glyph="print"></span></a>
                         </div>
                     </div>
                     <div class="row mb-2">
@@ -120,9 +154,16 @@
                             </div>
                         </div>
                     {% endfor %}
+                    {% else %}
+                        <div class="row">
+                            <div class="col-12 text-center">
+                                <div class="lead">No time entered</div>
+                            </div>
+                        </div>
+                    {% endif %}
                 </div>
             </div>
         </div>
     </div>
-    {% endif %}
+
 {% endblock %}

+ 2 - 0
app/urls.py

@@ -20,6 +20,8 @@ urlpatterns = [
     path('', views.home, name='home'),
     path('setup', views.setup, name='setup'),
     path('timesheet', views.timesheet, name="timesheet"),
+    path('timesheet/<int:year>/<int:month>', views.timesheet, name="timesheet"),
+    path('timesheet/<int:year>/<int:month>/<int:day>', views.timesheet, name="timesheet"),
     path('logout', views.logout_user, name="logout"),
     path('create/user', views.create_user, name="create_user"),
     path('remove/<int:entry_id>', views.remove, name='remove_entry'),

+ 65 - 11
app/views.py

@@ -1,9 +1,10 @@
 from django.shortcuts import render, redirect
-from . forms import LoginForm, CreateUserForm, TimeEntryForm, SettingsForm
-from django.core.validators import ValidationError
+from . forms import LoginForm, CreateUserForm, TimeEntryForm, SettingsForm, PastTimeEntryForm
 from . models import User, Setting, Entry
 from hashlib import sha256
 import datetime
+from django.template.defaultfilters import date
+from dateutil.relativedelta import relativedelta
 
 
 def hash_pin(pin):
@@ -129,7 +130,40 @@ def home(request):
     return render(request, 'home.html', context=context)
 
 
-def timesheet(request):
+def timesheet(request, year=None, month=None, day=None):
+    date = datetime.datetime.now()
+
+    if year is None:
+        year = date.year
+
+    if month is None:
+        month = date.month
+
+    if month > 12:
+        return redirect('timesheet', year=year, month=12)
+
+    if day is None:
+        day = date.day
+
+    if datetime.date(year=year, month=month, day=day) <= datetime.date.today():
+        show_form = True
+    else:
+        show_form = False
+
+    if datetime.date(year=year, month=month, day=day) < datetime.date.today():
+        show_next = True
+    else:
+        show_next = False
+
+    if datetime.date(year=year, month=month, day=day) == datetime.date.today():
+        today_is_today = True
+    else:
+        today_is_today = False
+
+    current_month = datetime.date(year, month, 1)
+    next_month = current_month + relativedelta(months=+1)
+    previous_month = current_month + relativedelta(months=-1)
+
     if requires_auth(request) is False:
         request.session['authenticated'] = False
         return redirect('home')
@@ -139,10 +173,18 @@ def timesheet(request):
 
     projects = Setting.objects.get(setting='Projects')
 
-    form = TimeEntryForm()
+    if today_is_today:
+        form = TimeEntryForm()
+    else:
+        form = PastTimeEntryForm(month=current_month.month, year=current_month.year)
 
     if request.method == "POST":
-        form = TimeEntryForm(request.POST)
+        # form = TimeEntryForm(request.POST)
+
+        if today_is_today:
+            form = TimeEntryForm(request.POST)
+        else:
+            form = PastTimeEntryForm(request.POST, month=current_month.month, year=current_month.year)
 
         if form.is_valid():
             data = form.cleaned_data
@@ -153,17 +195,22 @@ def timesheet(request):
                 entry = Entry()
                 entry.user = user
                 entry.project = data['project']
-                entry.date = datetime.datetime.now().date()
+                entry.date = datetime.date(year=current_month.year, month=current_month.month, day=current_month.day)
                 entry.hours = data['hours']
                 entry.minutes = data['minutes']
                 entry.save()
-                form = TimeEntryForm()
 
-    entries = Entry.objects.filter(user=user, date__month=datetime.datetime.now().month)
+                # form = TimeEntryForm()
+
+                if today_is_today:
+                    form = TimeEntryForm()
+                else:
+                    form = PastTimeEntryForm(month=current_month.month, year=current_month.year)
+
+    entries = Entry.objects.filter(user=user, date__year=current_month.year, date__month=current_month.month)
 
-    date = datetime.datetime.now()
     max_daily_entries = Setting.objects.get(setting='Max Daily Entries')
-    todays_entries = Entry.objects.filter(user=user, date=date).count()
+    todays_entries = Entry.objects.filter(user=user, date__year=current_month.year, date__month=current_month.month).count()
 
     max_daily_entries_quota = False
 
@@ -191,10 +238,17 @@ def timesheet(request):
         'user': user,
         'form': form,
         'entries': time_entries,
+        'show_form': show_form,
+        'show_next': show_next,
+        'today_is_today': today_is_today,
         'total_time_worked': total_time_worked,
         'max_daily_entries_quota': max_daily_entries_quota,
         'projects': projects.value,
-        'session_timeout': auth_timeout
+        'session_timeout': auth_timeout,
+        'current_month': current_month,
+        'current_month_name': current_month.strftime('%B'),
+        'next_month': next_month,
+        'previous_month': previous_month,
     }
 
     return render(request, 'timesheet.html', context=context)

+ 1 - 0
requirements.txt

@@ -4,3 +4,4 @@ Django==3.1.6
 django-crispy-forms==1.11.0
 pytz==2021.1
 sqlparse==0.4.1
+python-dateutil~=2.8.1