Skip to content

Commit d84f3fb

Browse files
committed
Update Django version and add swagger
1 parent 6eb5b6f commit d84f3fb

File tree

13 files changed

+99
-36
lines changed

13 files changed

+99
-36
lines changed

rest/requirements.txt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
Django==1.9.8
1+
Django==2.1.4
22
mysqlclient==1.3.7
3-
djangorestframework==3.4.0
4-
markdown==2.6.6
5-
django-filter==0.13.0
3+
djangorestframework==3.9.0
4+
markdown==2.6.10
5+
django-filter==2.0.0
66
djangorestframework-jwt==1.8.0
7-
django-cors-headers==1.1.0
7+
django-cors-headers==2.4.0
88
behave-django==0.3.0
99
selenium==2.53.6
1010
gunicorn==19.7.1
11-
django-import-export==0.7.0
11+
django-import-export==1.1.0
1212
django-admin-rangefilter==0.3.1
13-
django-admin-multiple-choice-list-filter==0.1.1
13+
django-admin-multiple-choice-list-filter==0.1.1
14+
django-rest-swagger==2.2.0

rest/rest/settings.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,21 @@
4141
'django.contrib.staticfiles',
4242
'import_export',
4343
'rangefilter',
44-
44+
'django_admin_multiple_choice_list_filter',
4545
'rest_framework',
4646
'corsheaders',
47-
4847
'time_tracker',
49-
'django_admin_multiple_choice_list_filter',
50-
51-
'behave_django'
48+
'behave_django',
49+
'rest_framework_swagger',
5250
]
5351

54-
MIDDLEWARE_CLASSES = [
52+
MIDDLEWARE = [
5553
'django.middleware.security.SecurityMiddleware',
5654
'django.contrib.sessions.middleware.SessionMiddleware',
5755
'corsheaders.middleware.CorsMiddleware',
5856
'django.middleware.common.CommonMiddleware',
5957
'django.middleware.csrf.CsrfViewMiddleware',
6058
'django.contrib.auth.middleware.AuthenticationMiddleware',
61-
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
6259
'django.contrib.messages.middleware.MessageMiddleware',
6360
'django.middleware.clickjacking.XFrameOptionsMiddleware',
6461
]
@@ -124,7 +121,7 @@
124121
'rest_framework.authentication.SessionAuthentication',
125122
'rest_framework.authentication.BasicAuthentication',
126123
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
127-
)
124+
),
128125
}
129126

130127
JWT_AUTH = {

rest/rest/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,16 @@
1818
from django.conf.urls import url, include
1919
from django.conf import settings
2020
from django.conf.urls.static import static
21+
from rest_framework_swagger.views import get_swagger_view
22+
from rest_framework.documentation import include_docs_urls
23+
2124

2225
urlpatterns = [
2326
url(r"", include("time_tracker.urls")),
2427
url(r"^admin/", admin.site.urls),
2528
url(r"^time-tracker/api/", include("time_tracker.urls")),
29+
url(r'^docs', include_docs_urls(title='MTR Time Tracker API')),
30+
url(r'^swagger$', get_swagger_view(title='MTR Time Tracker API')),
2631
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
2732

2833
if settings.DEBUG:

rest/time_tracker/filters/time_report_filter.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
1-
import django_filters
2-
1+
import django_filters.rest_framework
32
from django.db.models import F, Func
43

5-
from rest_framework import filters
6-
74
from time_tracker.models import TimeReport
85

96

10-
class TimeReportFilter(filters.FilterSet):
7+
class TimeReportFilter(django_filters.rest_framework.FilterSet):
118
FILTERS = ['MONTH', "YEAR", "DAY"]
129

13-
date = django_filters.DateFromToRangeFilter(name="date")
14-
project__id = django_filters.NumberFilter(name="project__id")
15-
profile__id = django_filters.NumberFilter(name="profile__id")
16-
group_by = django_filters.MethodFilter()
10+
date = django_filters.DateFromToRangeFilter(field_name="date")
11+
project__id = django_filters.NumberFilter(field_name="project__id")
12+
profile__id = django_filters.NumberFilter(field_name="profile__id")
13+
group_by = django_filters.CharFilter(method='filter_group_by')
1714

1815
class Meta:
1916
model = TimeReport

rest/time_tracker/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
router.register(r"time-reports", TimeReportViewSet)
1717

1818
urlpatterns = [
19-
url(r'', include(router.urls)),
19+
2020
url(r"^auth/jwt/new/", obtain_jwt_token),
2121
url(r"^auth/jwt/refresh/", refresh_jwt_token),
2222
url(r"^auth/jwt/verify/", verify_jwt_token),
2323
url(r"time-reports/profiles/", TimeReportViewSet.as_view({'get': 'get_profiles_reports'})),
2424
url(r"time-reports/projects/", TimeReportViewSet.as_view({'get': 'get_projects_reports'})),
2525
url(r"time-reports/total-hours/", TimeReportViewSet.as_view({'get': 'get_total_hours'})),
26+
url(r'', include(router.urls)),
27+
2628
]

rest/time_tracker/views/company.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66

77

88
class CompanyViewSet(viewsets.ModelViewSet):
9+
"""
10+
Working with company data
11+
12+
retrieve:
13+
Return the given company.
14+
15+
"""
916
queryset = Company.objects.all()
1017
serializer_class = CompanySerializer
1118
permission_classes = (CompanyPermission,)

rest/time_tracker/views/profile.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,36 @@
11
from rest_framework import filters
22
from rest_framework import viewsets
3+
from django_filters.rest_framework import DjangoFilterBackend
34

45
from time_tracker.models import Profile
56
from time_tracker.serializers import ProfileSerializer
67
from time_tracker.permissions import ProfilePermission
78

89

910
class ProfileViewSet(viewsets.ModelViewSet):
11+
"""
12+
Working with profile data
13+
14+
retrieve:
15+
Return the given profile.
16+
17+
list:
18+
Return a list of all the existing profiles.
19+
20+
update:
21+
Create a new profile instance.
22+
23+
partial_update:
24+
Update an existing profile
25+
"""
1026
queryset = Profile.objects.all()
1127
serializer_class = ProfileSerializer
1228
permission_classes = (ProfilePermission,)
13-
filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter)
29+
filter_backends = (DjangoFilterBackend, filters.OrderingFilter)
1430
filter_fields = ('user__id',)
1531
ordering_fields = ('first_name', 'last_name')
1632
ordering = ('first_name', 'last_name')
17-
33+
1834
def get_queryset(self):
1935
user = self.request.user
2036
profile = Profile.objects.filter(is_active=True)

rest/time_tracker/views/project.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
from rest_framework import filters
22
from rest_framework import viewsets
3+
from django_filters.rest_framework import DjangoFilterBackend
34

45
from time_tracker.models import Project
56
from time_tracker.serializers import ProjectSerializer
67
from time_tracker.permissions import ProjectPermission
78

89

910
class ProjectViewSet(viewsets.ModelViewSet):
11+
"""
12+
Working with project data
13+
14+
retrieve:
15+
Return the given project.
16+
17+
list:
18+
Return a list of all the existing project.
19+
20+
"""
1021
queryset = Project.objects.all()
1122
serializer_class = ProjectSerializer
1223
permission_classes = (ProjectPermission,)
13-
filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter)
24+
filter_backends = (DjangoFilterBackend, filters.OrderingFilter)
1425
filter_fields = ('is_finished',)
1526
ordering_fields = ('name',)
1627
ordering = ('name',)

rest/time_tracker/views/time_report.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,37 @@
1010
from time_tracker.filters.time_report_filter import TimeReportFilter
1111
from time_tracker.serializers import TimeReportProfileSerializer
1212
from time_tracker.serializers import TimeReportProjectSerializer
13+
from django_filters.rest_framework import DjangoFilterBackend
1314

1415

1516
class TimeReportViewSet(viewsets.ModelViewSet):
17+
"""
18+
Working with TimeReport data
19+
20+
retrieve:
21+
Return the given time report.
22+
23+
list:
24+
Return a list of all the existing time report.
25+
26+
create:
27+
Create a new time report.
28+
29+
update:
30+
Create a new time report instance.
31+
32+
partial_update:
33+
Update an existing time report
34+
35+
destroy:
36+
Delete an existing time report
37+
38+
"""
39+
1640
queryset = TimeReport.objects.all()
1741
serializer_class = TimeReportSerializer
1842
permission_classes = (TimeReportPermission,)
19-
filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter)
43+
filter_backends = (DjangoFilterBackend, filters.OrderingFilter)
2044
filter_class = TimeReportFilter
2145
ordering_fields = ('date', 'id')
2246
ordering = ('-date', '-id')
@@ -33,7 +57,7 @@ def get_profiles_reports(self, request):
3357
user = self.request.user
3458
time_report = TimeReportFilter(request.GET, queryset=TimeReport.objects.total_time_by(user, 'profile', 'profile__first_name'))
3559

36-
serializer = TimeReportProfileSerializer(time_report, many=True)
60+
serializer = TimeReportProfileSerializer(time_report.qs, many=True)
3761
return Response(serializer.data)
3862

3963
def get_projects_reports(self, request):
@@ -43,7 +67,7 @@ def get_projects_reports(self, request):
4367
user = self.request.user
4468
time_report = TimeReportFilter(request.GET, queryset=TimeReport.objects.total_time_by(user, 'project', 'project__name'))
4569

46-
serializer = TimeReportProjectSerializer(time_report, many=True)
70+
serializer = TimeReportProjectSerializer(time_report.qs, many=True)
4771
return Response(serializer.data)
4872

4973
def get_total_hours(self, request):
@@ -54,4 +78,4 @@ def get_total_hours(self, request):
5478
time_report = TimeReportFilter(request.GET, queryset=TimeReport.objects.active_projects(user, seconds__gt=0))
5579
time_report = time_report.qs.aggregate(total_seconds=Sum('seconds'))
5680
time_report['total_hours'] = TimeReport.sec_to_hours(time_report['total_seconds'])
57-
return Response(time_report)
81+
return Response(time_report)

webapp/src/app/app.component.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
44
<span class="navbar-toggler-icon"></span>
55
</button>
6-
<a class="navbar-brand" routerLink="/">{{ config.env.website.title }}</a>
6+
<a class="navbar-brand" routerLink="/">
7+
<img src="assets/images/logo.png" alt="Time Tracker">
8+
<strong>{{ config.env.website.title }}</strong>
9+
</a>
710

811
<div class="collapse navbar-collapse" id="navbar">
912
<ul class="navbar-nav mr-auto">

0 commit comments

Comments
 (0)