From 740c36cde9f4da0a1daeba0ddf8462e1b3dd514e Mon Sep 17 00:00:00 2001 From: Mukhtar Date: Tue, 17 May 2016 16:36:32 +0300 Subject: [PATCH 1/3] changes filters --- api/filters.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/api/filters.py b/api/filters.py index f726c70..4ae20c3 100755 --- a/api/filters.py +++ b/api/filters.py @@ -1,4 +1,9 @@ -# import rest_framework_filters as filters +import rest_framework_filters import FilterSet + + +class Project(FilterSet): + class Meta: + model = # # from common import models # From 782fbe3e875e5776494438e797de660f74b73c26 Mon Sep 17 00:00:00 2001 From: Mukhtar Date: Tue, 17 May 2016 16:37:49 +0300 Subject: [PATCH 2/3] delete migrations --- projects/migrations/0001_initial.py | 47 ------------------- .../migrations/0002_auto_20160516_1439.py | 35 -------------- projects/migrations/__init__.py | 0 specializations/migrations/0001_initial.py | 33 ------------- specializations/migrations/__init__.py | 0 users/migrations/0001_initial.py | 36 -------------- users/migrations/__init__.py | 0 7 files changed, 151 deletions(-) delete mode 100644 projects/migrations/0001_initial.py delete mode 100644 projects/migrations/0002_auto_20160516_1439.py delete mode 100644 projects/migrations/__init__.py delete mode 100644 specializations/migrations/0001_initial.py delete mode 100644 specializations/migrations/__init__.py delete mode 100644 users/migrations/0001_initial.py delete mode 100644 users/migrations/__init__.py diff --git a/projects/migrations/0001_initial.py b/projects/migrations/0001_initial.py deleted file mode 100644 index 8ef4b6c..0000000 --- a/projects/migrations/0001_initial.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-16 14:39 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('specializations', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Portfolio', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('description', models.TextField()), - ], - ), - migrations.CreateModel( - name='PortfolioPhoto', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('img', models.ImageField(upload_to='projects/portfolio')), - ], - ), - migrations.CreateModel( - name='Project', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('price', models.DecimalField(decimal_places=2, max_digits=10)), - ('text', models.TextField(blank=True)), - ('specialization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='spec', to='specializations.Specialization')), - ], - options={ - 'verbose_name': 'Проект', - 'verbose_name_plural': 'Проекты', - }, - ), - ] diff --git a/projects/migrations/0002_auto_20160516_1439.py b/projects/migrations/0002_auto_20160516_1439.py deleted file mode 100644 index b44991e..0000000 --- a/projects/migrations/0002_auto_20160516_1439.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-16 14:39 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('projects', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customers', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='portfoliophoto', - name='portfolio', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.Portfolio'), - ), - migrations.AddField( - model_name='portfolio', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/__init__.py b/projects/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/specializations/migrations/0001_initial.py b/specializations/migrations/0001_initial.py deleted file mode 100644 index d13ba5f..0000000 --- a/specializations/migrations/0001_initial.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-16 14:39 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Specialization', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('lft', models.PositiveIntegerField(db_index=True, editable=False)), - ('rght', models.PositiveIntegerField(db_index=True, editable=False)), - ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), - ('level', models.PositiveIntegerField(db_index=True, editable=False)), - ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='specializations.Specialization')), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/specializations/migrations/__init__.py b/specializations/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py deleted file mode 100644 index 926eb98..0000000 --- a/users/migrations/0001_initial.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-16 14:39 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('auth', '0007_alter_validators_add_error_messages'), - ] - - operations = [ - migrations.CreateModel( - name='CustomUser', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('firstname', models.CharField(blank=True, max_length=255)), - ('lastname', models.CharField(blank=True, max_length=255)), - ('email', models.EmailField(db_index=True, max_length=255, unique=True)), - ('is_active', models.BooleanField(default=True)), - ('is_admin', models.BooleanField(default=False)), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/users/migrations/__init__.py b/users/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 From dc79637e894d5b864f6ff201ceb2001d01984944 Mon Sep 17 00:00:00 2001 From: Mukhtar Date: Wed, 18 May 2016 19:28:15 +0300 Subject: [PATCH 3/3] Add Team model --- projects/forms.py | 11 ++++-- projects/migrations/0001_initial.py | 11 ++++-- .../migrations/0002_auto_20160517_0903.py | 35 ------------------- projects/migrations/__init__.py | 0 .../templates/projects/portfolio_form.html | 18 ++++++++++ projects/urls.py | 5 +-- projects/views.py | 20 +++++++---- specializations/migrations/0001_initial.py | 2 +- specializations/migrations/__init__.py | 0 users/admin.py | 3 +- users/migrations/0001_initial.py | 12 +++++-- users/migrations/__init__.py | 0 users/models.py | 34 ++++++++---------- 13 files changed, 78 insertions(+), 73 deletions(-) delete mode 100644 projects/migrations/0002_auto_20160517_0903.py create mode 100644 projects/migrations/__init__.py create mode 100644 projects/templates/projects/portfolio_form.html create mode 100644 specializations/migrations/__init__.py create mode 100644 users/migrations/__init__.py diff --git a/projects/forms.py b/projects/forms.py index 212da06..91343a9 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -1,8 +1,13 @@ from django.forms import ModelForm -from .models import Project +from .models import Project, Portfolio class ProjectForm(ModelForm): - class Meta: model = Project - fields = ['name', 'text', 'price', 'user','specialization'] \ No newline at end of file + fields = ['name', 'text', 'price', 'user','specialization'] + + +class PortfolioForm(ModelForm): + class Meta: + model = Portfolio + fields = '__all__' diff --git a/projects/migrations/0001_initial.py b/projects/migrations/0001_initial.py index 181f75a..7191b94 100644 --- a/projects/migrations/0001_initial.py +++ b/projects/migrations/0001_initial.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-17 09:03 +# Generated by Django 1.9.6 on 2016-05-18 16:08 from __future__ import unicode_literals +from django.conf import settings from django.db import migrations, models import django.db.models.deletion @@ -11,7 +12,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('specializations', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('specializations', '__first__'), ] operations = [ @@ -21,6 +23,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255)), ('description', models.TextField()), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -28,6 +31,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('img', models.ImageField(upload_to='projects/portfolio')), + ('portfolio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.Portfolio')), ], ), migrations.CreateModel( @@ -37,7 +41,8 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=255)), ('price', models.DecimalField(decimal_places=2, max_digits=10)), ('text', models.TextField(blank=True)), - ('specialization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='specializations.Specialization')), + ('specialization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='specializations.Specialization')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name_plural': 'Проекты', diff --git a/projects/migrations/0002_auto_20160517_0903.py b/projects/migrations/0002_auto_20160517_0903.py deleted file mode 100644 index 75cc8af..0000000 --- a/projects/migrations/0002_auto_20160517_0903.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-17 09:03 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('projects', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='portfoliophoto', - name='portfolio', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.Portfolio'), - ), - migrations.AddField( - model_name='portfolio', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/__init__.py b/projects/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/projects/templates/projects/portfolio_form.html b/projects/templates/projects/portfolio_form.html new file mode 100644 index 0000000..f2dc34a --- /dev/null +++ b/projects/templates/projects/portfolio_form.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} +{% block content %} +

Добавление

+
+ + {{ form.errors }} + {% csrf_token %} + + {% for field in form %} +
+ {{ field.label }} + {{ field }} +
+ {% endfor %} + + +
+{% endblock %}s diff --git a/projects/urls.py b/projects/urls.py index 2b24299..739e20e 100644 --- a/projects/urls.py +++ b/projects/urls.py @@ -1,11 +1,12 @@ from django.conf import urls # from django.contrib.auth.views import login, logout -from .views import ProjectListView, ProjectDetailView, ProjectCreateView +from .views import ProjectListView, ProjectDetailView, ProjectCreateView , PortfolioCreateView urlpatterns = [ urls.url(r'^$', ProjectListView.as_view(), name='projects-list'), urls.url(r'^create/$', ProjectCreateView.as_view(), name='project-create'), + urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'), urls.url(r'(?P\d+)$', ProjectDetailView.as_view(), name='project-detail'), -] \ No newline at end of file +] diff --git a/projects/views.py b/projects/views.py index aec1b49..2f0770e 100644 --- a/projects/views.py +++ b/projects/views.py @@ -1,12 +1,9 @@ from django.shortcuts import render from django.contrib.auth.mixins import PermissionRequiredMixin from django.views.generic import ListView, DetailView, CreateView -from django.contrib.auth.models import Permission -from django.contrib.auth.decorators import permission_required -from .models import Project -from users.models import User -from .forms import ProjectForm +from .models import Project, Portfolio +from .forms import ProjectForm, PortfolioForm class ProjectListView(ListView): @@ -16,13 +13,24 @@ class ProjectListView(ListView): context = super(ProjectListView, self).get_context_data(**kwargs) return context + class ProjectDetailView(DetailView): model = Project - class ProjectCreateView(PermissionRequiredMixin, CreateView): model = Project permission_required = ['projects.add_project'] + raise_exception = True form_class = ProjectForm success_url = '/projects/' + + +class PortfolioCreateView(PermissionRequiredMixin, CreateView): + model = Portfolio + form_class = PortfolioForm + permission_required = ['projects.add_portfolio'] + success_url = '/projects/' + + + diff --git a/specializations/migrations/0001_initial.py b/specializations/migrations/0001_initial.py index 1c61ee0..3fd29b0 100644 --- a/specializations/migrations/0001_initial.py +++ b/specializations/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-17 09:03 +# Generated by Django 1.9.6 on 2016-05-18 16:08 from __future__ import unicode_literals from django.db import migrations, models diff --git a/specializations/migrations/__init__.py b/specializations/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/users/admin.py b/users/admin.py index c444238..33a8e74 100644 --- a/users/admin.py +++ b/users/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from .models import User +from .models import User, Team admin.site.register(User) +admin.site.register(Team) diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py index 2ec7900..13202cd 100644 --- a/users/migrations/0001_initial.py +++ b/users/migrations/0001_initial.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-17 09:03 +# Generated by Django 1.9.6 on 2016-05-18 16:08 from __future__ import unicode_literals +from django.conf import settings from django.db import migrations, models @@ -25,7 +26,6 @@ class Migration(migrations.Migration): ('last_name', models.CharField(blank=True, max_length=255)), ('email', models.EmailField(db_index=True, max_length=255, unique=True)), ('is_active', models.BooleanField(default=True)), - ('is_admin', models.BooleanField(default=False)), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), ], @@ -33,4 +33,12 @@ class Migration(migrations.Migration): 'abstract': False, }, ), + migrations.CreateModel( + name='Team', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('users', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL)), + ], + ), ] diff --git a/users/migrations/__init__.py b/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/users/models.py b/users/models.py index b292b05..59f3c90 100644 --- a/users/models.py +++ b/users/models.py @@ -15,7 +15,7 @@ class UserManager(BaseUserManager): def create_superuser(self, email, password): user = self.create_user(email, password) - user.is_admin = True + user.is_superuser = True user.save(using=self._db) return user @@ -35,11 +35,10 @@ class User(AbstractBaseUser, PermissionsMixin): last_name = models.CharField(max_length=255, blank=True) email = models.EmailField(max_length=255, unique=True, db_index=True) is_active = models.BooleanField(default=True) - is_admin = models.BooleanField(default=False) - + @property def is_staff(self): - return self.is_admin + return self.is_superuser def __str__(self): return self.email @@ -49,25 +48,20 @@ class User(AbstractBaseUser, PermissionsMixin): def get_full_name(self): return self.first_name + ' ' + self.last_name - - # def has_perm(self, perm, obj=None): - # perm = perm.split('.')[-1] - # if self.user and not self.user.is_active: - # return False - # elif self.user and self.user.is_superuser: - # return True - # return perm in self.get_perms(obj) - # - # - def has_perm(self, perm, obj=None): - # return self.is_admin - return True - - def has_module_perms(self, app_label): - return self.is_admin USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] objects = UserManager() perform_objects = PerformUserManager() customers_objects = CustomerUserManager() + + +class Team(models.Model): + name = models.CharField(max_length=255) + users = models.ManyToManyField(User, blank=True) + owner = models.OneToOneField(User, related_name='team') + + def __str__(self): + return self.name + +