diff --git a/.gitignore b/.gitignore index 0297516..44c1c9e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,4 @@ db.sqlite3 staticfiles/* .cache/* .idea/* -*migrations* diff --git a/FreeTimeLance/__init__.py b/FreeTimeLance/__init__.py index cd291a6..0f016bb 100644 --- a/FreeTimeLance/__init__.py +++ b/FreeTimeLance/__init__.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ Django project to manage your work time as a freelancer and share the information with your customer diff --git a/FreeTimeLance/settings.py b/FreeTimeLance/settings.py index 2cb4031..ba7b850 100644 --- a/FreeTimeLance/settings.py +++ b/FreeTimeLance/settings.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ Django settings for FreeTimeLance project. diff --git a/FreeTimeLance/urls.py b/FreeTimeLance/urls.py index 6a70d99..c32176d 100644 --- a/FreeTimeLance/urls.py +++ b/FreeTimeLance/urls.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """FreeTimeLance URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: diff --git a/FreeTimeLance/wsgi.py b/FreeTimeLance/wsgi.py index dfaf3c9..755df4a 100644 --- a/FreeTimeLance/wsgi.py +++ b/FreeTimeLance/wsgi.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ WSGI config for FreeTimeLance project. diff --git a/hamster_import/hamster_import.py b/hamster_import/hamster_import.py index bf446b9..242ebad 100644 --- a/hamster_import/hamster_import.py +++ b/hamster_import/hamster_import.py @@ -1,5 +1,5 @@ from .hamster_models import Facts -from project.models import Activity, Customer, Project +from project.models import Activity, Customer, FreelanceProject try: from urllib.request import urlopen except ImportError: @@ -20,7 +20,7 @@ def download_hamster_db(url, filename=settings.DATABASES['hamster']['NAME']): def import_db_entries(): customer_names = [c.name.lower() for c in Customer.objects.all()] - project_names = [p.name.lower() for p in Project.objects.all()] + project_names = [p.name.lower() for p in FreelanceProject.objects.all()] for fact in Facts.objects.all(): if fact.activity.name.lower() not in customer_names: continue @@ -33,7 +33,7 @@ def import_db_entries(): hamster_id=fact.id, start_time=fact.start_time, end_time=fact.end_time, - project=Project.objects.get(name__iexact=tag.name), + project=FreelanceProject.objects.get(name__iexact=tag.name), remarks=description) if created: HAMSTER_LOGGER.info('Created Activitiy with hamster_id {0}' diff --git a/hamster_import/migrations/0001_initial.py b/hamster_import/migrations/0001_initial.py new file mode 100644 index 0000000..b99d36c --- /dev/null +++ b/hamster_import/migrations/0001_initial.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-12-13 14:25 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Activities', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, null=True)), + ('work', models.IntegerField(blank=True, null=True)), + ('activity_order', models.IntegerField(blank=True, null=True)), + ('deleted', models.IntegerField(blank=True, null=True)), + ('search_name', models.TextField(blank=True, null=True)), + ], + options={ + 'managed': False, + 'db_table': 'activities', + }, + ), + migrations.CreateModel( + name='Categories', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, null=True)), + ('color_code', models.TextField(blank=True, null=True)), + ('category_order', models.IntegerField(blank=True, null=True)), + ('search_name', models.TextField(blank=True, null=True)), + ], + options={ + 'managed': False, + 'db_table': 'categories', + }, + ), + migrations.CreateModel( + name='Facts', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start_time', models.TextField(blank=True, null=True)), + ('end_time', models.TextField(blank=True, null=True)), + ('description', models.TextField(blank=True, null=True)), + ], + options={ + 'managed': False, + 'db_table': 'facts', + }, + ), + migrations.CreateModel( + name='Tags', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField()), + ('autocomplete', models.NullBooleanField()), + ], + options={ + 'managed': False, + 'db_table': 'tags', + }, + ), + migrations.CreateModel( + name='FactTags', + fields=[ + ('fact', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='hamster_import.Facts')), + ], + options={ + 'managed': False, + 'db_table': 'fact_tags', + }, + ), + ] diff --git a/hamster_import/migrations/__init__.py b/hamster_import/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/manage.py b/manage.py index 50f7972..46f5056 100755 --- a/manage.py +++ b/manage.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# coding=utf-8 +# -*- coding: utf-8 -*- """ Default manage.py from django """ diff --git a/project/admin.py b/project/admin.py index 1072045..34e761d 100644 --- a/project/admin.py +++ b/project/admin.py @@ -1,13 +1,13 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ Configuration of the Admin interface """ from django.contrib import admin from django.contrib.admin import ModelAdmin -from project.models import Project, Customer, Activity - +from project.models import FreelanceProject, Customer, Activity, EmployeeProject admin.site.register(Activity, ModelAdmin) admin.site.register(Customer, ModelAdmin) -admin.site.register(Project, ModelAdmin) +admin.site.register(FreelanceProject, ModelAdmin) +admin.site.register(EmployeeProject, ModelAdmin) diff --git a/project/migrations/0001_initial.py b/project/migrations/0001_initial.py new file mode 100644 index 0000000..a394ecb --- /dev/null +++ b/project/migrations/0001_initial.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-12-12 10:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('invitations', '0003_auto_20151126_1523'), + ('auth', '0008_alter_user_username_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='Activity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start_time', models.DateTimeField(verbose_name='Start time')), + ('end_time', models.DateTimeField(verbose_name='End time')), + ('remarks', models.TextField(verbose_name='Remarks for the done work')), + ], + ), + migrations.CreateModel( + name='Customer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250, verbose_name='Name of the customer')), + ], + ), + migrations.CreateModel( + name='CustomerInvitation', + fields=[ + ('invitation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='invitations.Invitation')), + ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='project.Customer')), + ], + bases=('invitations.invitation',), + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250, verbose_name='Name of the project')), + ('description', models.TextField(verbose_name='Description of the target of the project')), + ('start_date', models.DateField(verbose_name='Start date')), + ('death_line', models.DateField(verbose_name='Death line')), + ('workload', models.DurationField(verbose_name='Submitted number of working hours')), + ('repository', models.URLField(verbose_name='Url of the repository')), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.Customer')), + ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ], + ), + migrations.AddField( + model_name='activity', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.Project'), + ), + ] diff --git a/project/migrations/0001_squashed_0003_auto_20161213_1033.py b/project/migrations/0001_squashed_0003_auto_20161213_1033.py new file mode 100644 index 0000000..258c2c3 --- /dev/null +++ b/project/migrations/0001_squashed_0003_auto_20161213_1033.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-12-16 06:57 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + replaces = [('project', '0001_initial'), ('project', '0002_activity_hamster_id'), ('project', '0003_auto_20161213_1033')] + + initial = True + + dependencies = [ + ('auth', '0008_alter_user_username_max_length'), + ('invitations', '0003_auto_20151126_1523'), + ] + + operations = [ + migrations.CreateModel( + name='Activity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start_time', models.DateTimeField(verbose_name='Start time')), + ('end_time', models.DateTimeField(verbose_name='End time')), + ('remarks', models.TextField(verbose_name='Remarks for the done work')), + ], + ), + migrations.CreateModel( + name='Customer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250, verbose_name='Name of the customer')), + ], + ), + migrations.CreateModel( + name='CustomerInvitation', + fields=[ + ('invitation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='invitations.Invitation')), + ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='project.Customer')), + ], + bases=('invitations.invitation',), + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250, verbose_name='Name of the project')), + ('description', models.TextField(verbose_name='Description of the target of the project')), + ('start_date', models.DateField(verbose_name='Start date')), + ('death_line', models.DateField(verbose_name='Death line')), + ('workload', models.DurationField(verbose_name='Submitted number of working hours')), + ('repository', models.URLField(verbose_name='Url of the repository')), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.Customer')), + ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ], + ), + migrations.AddField( + model_name='activity', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.Project'), + ), + migrations.AddField( + model_name='activity', + name='hamster_id', + field=models.IntegerField(blank=True, null=True, unique=True, verbose_name='Id of hamster activity'), + ), + migrations.AlterField( + model_name='activity', + name='remarks', + field=models.TextField(null=True, verbose_name='Remarks for the done work'), + ), + ] diff --git a/project/migrations/0002_activity_hamster_id.py b/project/migrations/0002_activity_hamster_id.py new file mode 100644 index 0000000..4c5e68e --- /dev/null +++ b/project/migrations/0002_activity_hamster_id.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-12-13 10:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='activity', + name='hamster_id', + field=models.IntegerField(blank=True, null=True, unique=True, verbose_name='Id of hamster activity'), + ), + ] diff --git a/project/migrations/0002_auto_20180426_1814.py b/project/migrations/0002_auto_20180426_1814.py new file mode 100644 index 0000000..b2eade7 --- /dev/null +++ b/project/migrations/0002_auto_20180426_1814.py @@ -0,0 +1,69 @@ +# Generated by Django 2.0 on 2018-04-26 18:14 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), + ('project', '0001_squashed_0003_auto_20161213_1033'), + ] + + operations = [ + migrations.CreateModel( + name='BaseProject', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250, verbose_name='Name of the project')), + ('description', models.TextField(verbose_name='Description of the target of the project')), + ], + ), + migrations.RemoveField( + model_name='project', + name='customer', + ), + migrations.RemoveField( + model_name='project', + name='group', + ), + migrations.AlterField( + model_name='activity', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.BaseProject'), + ), + migrations.CreateModel( + name='EmployeeProject', + fields=[ + ('baseproject_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='project.BaseProject')), + ('weekly_workload', models.DurationField(verbose_name='Normal number of weekly working hours')), + ('vacation_days', models.IntegerField(verbose_name='Number of vacation days per year')), + ], + bases=('project.baseproject',), + ), + migrations.CreateModel( + name='FreelanceProject', + fields=[ + ('baseproject_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='project.BaseProject')), + ('start_date', models.DateField(verbose_name='Start date')), + ('death_line', models.DateField(verbose_name='Death line')), + ('workload', models.DurationField(verbose_name='Submitted number of working hours')), + ('repository', models.URLField(verbose_name='Url of the repository')), + ], + bases=('project.baseproject',), + ), + migrations.DeleteModel( + name='Project', + ), + migrations.AddField( + model_name='baseproject', + name='customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.Customer'), + ), + migrations.AddField( + model_name='baseproject', + name='group', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='auth.Group'), + ), + ] diff --git a/project/migrations/0003_auto_20161213_1033.py b/project/migrations/0003_auto_20161213_1033.py new file mode 100644 index 0000000..0598fc8 --- /dev/null +++ b/project/migrations/0003_auto_20161213_1033.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-12-13 10:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0002_activity_hamster_id'), + ] + + operations = [ + migrations.AlterField( + model_name='activity', + name='remarks', + field=models.TextField(null=True, verbose_name='Remarks for the done work'), + ), + ] diff --git a/project/migrations/__init__.py b/project/migrations/__init__.py new file mode 100644 index 0000000..9bad579 --- /dev/null +++ b/project/migrations/__init__.py @@ -0,0 +1 @@ +# coding=utf-8 diff --git a/project/models.py b/project/models.py index b55059c..5557097 100644 --- a/project/models.py +++ b/project/models.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ DB Models for the application """ @@ -75,17 +75,13 @@ def after_project_saved(sender, instance, created, *args, **kwargs): @python_2_unicode_compatible -class Project(models.Model): +class BaseProject(models.Model): """ Project for which you get a order """ name = models.CharField('Name of the project', max_length=250) customer = models.ForeignKey('Customer', on_delete=models.CASCADE) description = models.TextField('Description of the target of the project') - start_date = models.DateField('Start date') - death_line = models.DateField('Death line') - workload = models.DurationField('Submitted number of working hours') - repository = models.URLField('Url of the repository') group = models.ForeignKey( 'auth.Group', blank=True, @@ -120,7 +116,27 @@ def get_durations_dump(self): return dumps(times) -post_save.connect(after_project_saved, sender=Project) +@python_2_unicode_compatible +class FreelanceProject(BaseProject): + """ + Project for which you get a order + """ + start_date = models.DateField('Start date') + death_line = models.DateField('Death line') + workload = models.DurationField('Submitted number of working hours') + repository = models.URLField('Url of the repository') + + +@python_2_unicode_compatible +class EmployeeProject(BaseProject): + """ + Project for working as normal employee + """ + weekly_workload = models.DurationField('Normal number of weekly working hours') + vacation_days = models.IntegerField('Number of vacation days per year') + +post_save.connect(after_project_saved, sender=FreelanceProject) +post_save.connect(after_project_saved, sender=EmployeeProject) @python_2_unicode_compatible @@ -132,7 +148,7 @@ class Activity(models.Model): blank=True, null=True) start_time = models.DateTimeField('Start time') end_time = models.DateTimeField('End time') - project = models.ForeignKey('Project', on_delete=models.CASCADE) + project = models.ForeignKey('BaseProject', on_delete=models.CASCADE) remarks = models.TextField('Remarks for the done work', null=True) def duration(self): diff --git a/project/templatetags/__init__.py b/project/templatetags/__init__.py index 0d66eb5..438cb05 100644 --- a/project/templatetags/__init__.py +++ b/project/templatetags/__init__.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ User defined template tags """ diff --git a/project/templatetags/project_filters.py b/project/templatetags/project_filters.py index 8d3b4b9..1e3ccc2 100644 --- a/project/templatetags/project_filters.py +++ b/project/templatetags/project_filters.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ User defined templates tags and filters """ diff --git a/project/tests/test_gui.py b/project/tests/test_gui.py index 98b0354..c119f2c 100644 --- a/project/tests/test_gui.py +++ b/project/tests/test_gui.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- class TestAddButton: diff --git a/project/tests/utilities.py b/project/tests/utilities.py index 2eb7ade..4811e69 100644 --- a/project/tests/utilities.py +++ b/project/tests/utilities.py @@ -5,7 +5,7 @@ """ from django.utils.timezone import now, timedelta from django.contrib.auth.models import User -from ..models import Customer, Activity, Project +from ..models import Customer, Activity, FreelanceProject def create_customers(): @@ -26,8 +26,8 @@ def create_projects(): """ for customer in Customer.objects.all(): for i in range(10): - project, _ = Project.objects.get_or_create( - name="{0}_Project_{1}".format(customer.name, i), + project, _ = FreelanceProject.objects.get_or_create( + name="{0}_FreelanceProject_{1}".format(customer.name, i), customer=customer, description="Test project {0}".format(i), start_date=now(), @@ -44,7 +44,7 @@ def create_activities(): """ Creates sample activities for unit tests """ - for project in Project.objects.all(): + for project in FreelanceProject.objects.all(): for i in range(10): Activity.objects.get_or_create( start_time=now(), diff --git a/project/urls.py b/project/urls.py index 7ea3208..c318183 100644 --- a/project/urls.py +++ b/project/urls.py @@ -1,12 +1,14 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ Url routing of the project app """ from django.conf.urls import url from django.contrib.auth.decorators import login_required, permission_required -from project.views import ProjectView, ProjectListView, DeleteProjectView -from project.views import UpdateProjectView, CreateProjectView +from project.views import FreelanceProjectView, FreelanceProjectListView +from project.views import DeleteFreelanceProjectView +from project.views import CreateFreelanceProjectView +from project.views import UpdateFreelanceProjectView from project.views import UpdateActivityView, CreateActivityView, ActivityView from project.views import ActivityListView, DeleteActivityView from project.views import CustomerView, CustomerListView, CreateCustomerView @@ -41,16 +43,17 @@ url(r'^customer/delete/(?P[0-9]+)/$', permission_required('is_staff')(DeleteCustomerView.as_view()), name='delete_customer_view'), - url(r'^(?P[0-9]+)/$', login_required(ProjectView.as_view()), + url(r'^(?P[0-9]+)/$', login_required(FreelanceProjectView.as_view()), name='project_view'), - url(r'^$', login_required(ProjectListView.as_view()), name='project_list'), + url(r'^$', login_required(FreelanceProjectListView.as_view()), + name='project_list'), url(r'^create/$', - permission_required('is_staff')(CreateProjectView.as_view()), + permission_required('is_staff')(CreateFreelanceProjectView.as_view()), name='create_project_view'), url(r'^update/(?P[0-9]+)/$', - permission_required('is_staff')(UpdateProjectView.as_view()), + permission_required('is_staff')(UpdateFreelanceProjectView.as_view()), name='update_project_view'), url(r'^delete/(?P[0-9]+)/$', - permission_required('is_staff')(DeleteProjectView.as_view()), + permission_required('is_staff')(DeleteFreelanceProjectView.as_view()), name='delete_project_view'), ] diff --git a/project/views.py b/project/views.py index 0470fc8..0f908e7 100644 --- a/project/views.py +++ b/project/views.py @@ -1,4 +1,4 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- """ Views of the project app """ @@ -15,7 +15,8 @@ from django.views.generic import FormView from invitations.views import AcceptInvite -from project.models import Project, Activity, Customer, CustomerInvitation +from project.models import FreelanceProject, Activity, Customer +from project.models import CustomerInvitation def show_404(request): @@ -50,34 +51,38 @@ def form_valid(self, form): return super(CustomerSignUpView, self).form_valid(form) -class ProjectListView(ListView): +class FreelanceProjectListView(ListView): """ List all projects of the logined customer. If the user is in the staff group all project will be shown """ - model = Project + model = FreelanceProject template_name = "project_list.html" def get_context_data(self, **kwargs): """ Filters the list of projects to which the user is allowed to see """ - context = super(ProjectListView, self).get_context_data(**kwargs) - projects = context['project_list'] + context = super(FreelanceProjectListView, self).get_context_data( + **kwargs + ) + projects = context['freelanceproject_list'] if not self.request.user.is_staff: - project = projects.filter(group__in=self.request.user.groups.all()) - context['project_list'] = project + projects = projects.filter( + group__in=self.request.user.groups.all() + ) + context['project_list'] = projects return context -class ProjectView(UserPassesTestMixin, DetailView): +class FreelanceProjectView(UserPassesTestMixin, DetailView): """ Overview for one project with pie chart and a table of all activities. The user has to be in the user group of the customer or staff to see the overview """ template_name = "project_view.html" - model = Project + model = FreelanceProject def test_func(self): """ @@ -95,8 +100,9 @@ def get_context_data(self, **kwargs): """ Adds the chart data to the context """ - context = super(ProjectView, self).get_context_data(**kwargs) + context = super(FreelanceProjectView, self).get_context_data(**kwargs) context['times'] = self.get_object().get_durations_dump() + context['project'] = context['freelanceproject'] return context def post(self, request, *args, **kwargs): @@ -118,33 +124,33 @@ def post(self, request, *args, **kwargs): return JsonResponse(context) -class CreateProjectView(CreateView): +class CreateFreelanceProjectView(CreateView): """ View to create a new project. Only for staff. """ template_name = "project_edit_view.html" - model = Project + model = FreelanceProject fields = ['name', 'customer', 'description', 'start_date', 'death_line', 'workload', 'repository'] success_url = reverse_lazy('project_list') -class UpdateProjectView(UpdateView): +class UpdateFreelanceProjectView(UpdateView): """ View to update a project. Only for staff. """ template_name = "project_edit_view.html" - model = Project + model = FreelanceProject fields = ['name', 'customer', 'description', 'start_date', 'death_line', 'workload', 'repository'] success_url = reverse_lazy('project_list') -class DeleteProjectView(DeleteView): +class DeleteFreelanceProjectView(DeleteView): """ View to delete a project. Only for staff. """ - model = Project + model = FreelanceProject template_name = "delete_base.html" success_url = reverse_lazy('project_list') diff --git a/requirements.txt b/requirements.txt index dc7dd8a..e3a779c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,4 @@ django-debug-toolbar django-cron psycopg2 codecov +holidays