add specialization

remotes/origin/setup
Mukhtar 10 years ago
parent b79e19cc41
commit 7587ec892f
  1. 32
      archilance/settings/base.py
  2. 2
      archilance/settings/dev.py
  3. 1
      archilance/urls.py
  4. BIN
      db.sqlite3
  5. BIN
      media/projects/portfolio/slide-01.jpg
  6. BIN
      media/projects/portfolio/slide-02.jpg
  7. BIN
      media/projects/portfolio/slide-02_duVsn8v.jpg
  8. 5
      projects/admin.py
  9. 2
      projects/forms.py
  10. 29
      projects/migrations/0001_initial.py
  11. 23
      projects/migrations/0002_project_user.py
  12. 21
      projects/models.py
  13. 8
      projects/signals.py
  14. 1
      projects/templates/projects/project_detail.html
  15. 30
      projects/templates/projects/project_form.html
  16. 6
      projects/templates/projects/project_list.html
  17. 1
      projects/urls.py
  18. 6
      projects/views.py
  19. 0
      specialization/__init__.py
  20. 5
      specialization/admin.py
  21. 5
      specialization/apps.py
  22. 29
      specialization/migrations/0001_initial.py
  23. 39
      specialization/migrations/0002_auto_20160512_1013.py
  24. 0
      specialization/migrations/__init__.py
  25. 19
      specialization/models.py
  26. 30
      specialization/templates/specialization/specialization_list.html
  27. 3
      specialization/tests.py
  28. 8
      specialization/urls.py
  29. 16
      specialization/views.py
  30. 24
      templates/registration/login.html
  31. 13
      templates/registration/registration_form.html
  32. 11
      test.py
  33. 3
      users/admin.py
  34. 25
      users/migrations/0002_auto_20160511_1135.py
  35. 24
      users/models.py
  36. 15
      users/templates/users/users_info_list.html
  37. 62
      users/templates/users/users_list.html
  38. 8
      users/templatetags/user_tags.py
  39. 3
      users/urls.py
  40. 13
      users/views.py

@ -30,23 +30,26 @@ ALLOWED_HOSTS = []
# Application definition
DJANGO_APPS = (
DJANGO_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
]
THIRD_PARTY_APPS = (
THIRD_PARTY_APPS = [
'registration',
)
'mptt',
'guardian',
]
LOCAL_APPS = (
LOCAL_APPS = [
'projects',
'users',
)
'specialization',
]
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
@ -86,10 +89,21 @@ WSGI_APPLICATION = 'archilance.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(ROOT_DIR, 'db.sqlite3'),
# }
# }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(ROOT_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'archilance',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'localhost',
'PORT': '',
}
}
@ -114,6 +128,7 @@ AUTH_PASSWORD_VALIDATORS = [
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'guardian.backends.ObjectPermissionBackend',
)
@ -147,6 +162,7 @@ STATICFILES_DIRS = (
AUTH_USER_MODEL = 'users.CustomUser'
ACCOUNT_ACTIVATION_DAYS = 7
REGISTRATION_AUTO_LOGIN = True
LOGIN_REDIRECT_URL = '/projects/'
if DEBUG:
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'

@ -1 +1,3 @@
from .base import *
INSTALLED_APPS += ['debug_toolbar',]

@ -24,6 +24,7 @@ from .views import HomeTemplateView
urlpatterns = [
url(r'^$', HomeTemplateView.as_view()),
url(r'^projects/', include('projects.urls')),
url(r'^specialization/', include('specialization.urls')),
url(r'^users/', include('registration.backends.default.urls')),
url(r'^users/', include('users.urls')),
url(r'^admin/', admin.site.urls),

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

@ -1,4 +1,7 @@
from django.contrib import admin
from .models import Project
from .models import Project, Portfolio, PortfolioPhoto
admin.site.register(Project)
admin.site.register(Portfolio)
admin.site.register(PortfolioPhoto)

@ -5,4 +5,4 @@ class ProjectForm(ModelForm):
class Meta:
model = Project
fields = ['name', 'text']
fields = ['name', 'text', 'price', 'user','specialization']

@ -1,8 +1,10 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-05-05 10:12
# Generated by Django 1.9.6 on 2016-05-12 10:37
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):
@ -10,9 +12,28 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('specialization', '0002_auto_20160512_1013'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
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()),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
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')),
('portfolio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.Portfolio')),
],
),
migrations.CreateModel(
name='Project',
fields=[
@ -20,6 +41,12 @@ 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='spec', to='specialization.Specialization')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customers', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name_plural': 'Проекты',
'verbose_name': 'Проект',
},
),
]

@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-05-06 09:36
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):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('projects', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='project',
name='user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customers', to=settings.AUTH_USER_MODEL),
),
]

@ -1,13 +1,17 @@
# coding: utf-8
from django.db import models
from users.models import CustomUser
from specialization.models import Specialization
class Project(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
text = models.TextField(blank=True)
# type_work = models.CharField()
# budget = models.CharField()
# cro = models.BooleanField(default=False)
user = models.ForeignKey(CustomUser, related_name='customers')
specialization = models.ForeignKey(Specialization, related_name='spec', null=True)
def __str__(self):
return self.name
@ -15,3 +19,18 @@ class Project(models.Model):
class Meta:
verbose_name = 'Проект'
verbose_name_plural = 'Проекты'
class Portfolio(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
user = models.ForeignKey(CustomUser)
def __str__(self):
return self.name
class PortfolioPhoto(models.Model):
img = models.ImageField(upload_to='projects/portfolio')
portfolio = models.ForeignKey(Portfolio)
# def __str__(self):
# return self.img

@ -0,0 +1,8 @@
from django.core.signals import request_finished
from django.dispatch import receiver
from .models import Project
@receiver(request_finished)
def add_project_test(sender, **kwargs):
pr = Project.objects.create(name='Test', price=100, user=2, spec=2)
pr.save()

@ -1,4 +1,5 @@
{% extends "base.html" %}
{% block content %}
<h1>{{ object }}</h1>
<h2>{{ object.user }}</h2>
{% endblock %}s

@ -2,14 +2,30 @@
{% block content %}
<h1>Добавление</h1>
<form method="post" action="">
{{ form.errors }}
{% csrf_token %}
<input type="text" name="{{ form.name.name }}" class="col-xs-10 form-control" placeholder="Название" />
<p>{{ form.name.errors.as_text }}</p>
<input type="text" name="{{ form.price.name }}" class="col-xs-10 form-control" placeholder="Цена" />
<p>{{ form.price.errors.as_text }}</p>
<textarea name="{{ form.text.name }}"></textarea>
<p>{{ form.text.errors.as_text }}</p>
<button type="submit" class="btn registr_button">Добавить</button>
{% for field in form %}
<div class="row">
{{ field.label }}
{{ field }}
</div>
{% endfor %}
{# {% for field in form %}#}
{# <div class="col-lg-12">#}
{# <input type="text" class="searchInp box-sizing" placeholder="{{ field.label }}" name=" {{ field.name }}">#}
{# </div>#}
{##}
{# {% endfor %}#}
<input type="submit" value="Создать" />
{# <input type="text" name="{{ form.name.name }}" class="col-xs-10 form-control" placeholder="Название" />#}
{# <p>{{ form.name.errors.as_text }}</p>#}
{# <input type="text" name="{{ form.price.name }}" class="col-xs-10 form-control" placeholder="Цена" />#}
{# <p>{{ form.price.errors.as_text }}</p>#}
{# <textarea name="{{ form.text.name }}"></textarea>#}
{# <p>{{ form.text.errors.as_text }}</p>#}
{# #}
{# <button type="submit" class="btn registr_button">Добавить</button>#}
</form>
{% endblock %}s

@ -197,12 +197,6 @@
</div>
</div>
{% endfor %}
{{ user_id }}
{{ user }}
{% for perm in permissions %}
<h4>{{ perm }}</h4>
<h5>{{ perm.codename }}</h5>
{% endfor %}
</div>
<div class="col-lg-12 pagin">

@ -3,6 +3,7 @@ from django.conf import urls
from .views import ProjectListView, ProjectDetailView, ProjectCreateView
urlpatterns = [
urls.url(r'^$', ProjectListView.as_view(), name='projects-list'),
urls.url(r'^create/$', ProjectCreateView.as_view(), name='project-create'),

@ -14,17 +14,13 @@ class ProjectListView(ListView):
def get_context_data(self, **kwargs):
context = super(ProjectListView, self).get_context_data(**kwargs)
# context['permissions'] = Permission.objects.filter(group__user=self.request.user.id)
user = CustomUser.objects.get(id=self.request.user.id)
# context['permissions'] = user.user_permissions.all()
context['permissions'] = Permission.objects.filter(group__user=user)
context['user_id'] = user
return context
class ProjectDetailView(DetailView):
model = Project
class ProjectCreateView(PermissionRequiredMixin, CreateView):
model = Project
permission_required = ['projects.add_project']

@ -0,0 +1,5 @@
from django.contrib import admin
from mptt.admin import MPTTModelAdmin
from specialization.models import Specialization
admin.site.register(Specialization, MPTTModelAdmin)

@ -0,0 +1,5 @@
from django.apps import AppConfig
class SpecializationConfig(AppConfig):
name = 'specialization'

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-05-12 09:28
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('path', models.CharField(max_length=255, unique=True)),
('depth', models.PositiveIntegerField()),
('numchild', models.PositiveIntegerField(default=0)),
('name', models.CharField(max_length=50)),
],
options={
'abstract': False,
},
),
]

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-05-12 10:13
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import django.db.models.manager
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
('specialization', '0001_initial'),
]
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='specialization.Specialization')),
],
options={
'abstract': False,
},
managers=[
('_default_manager', django.db.models.manager.Manager()),
],
),
migrations.DeleteModel(
name='Category',
),
]

@ -0,0 +1,19 @@
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
from mptt.managers import TreeManager
class Specialization(MPTTModel):
name = models.CharField(max_length=100)
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
objects = TreeManager()
def __str__(self):
return self.name
class MPTTMeta:
order_insertion_by = ['name']

@ -0,0 +1,30 @@
{% extends "base.html" %}
{% block content %}
<h1>Специализации</h1>
{% load mptt_tags %}
{# {% for spec in object_list %}#}
{# <h4>{{ spec }}</h4>#}
{# {% endfor %}#}
{##}
{# {% load mptt_tags %}#}
{#<ul>#}
{# {% recursetree object_list %}#}
{# <li>#}
{# {{ node.name }}#}
{# {% if not node.is_leaf_node %}#}
{# <ul class="children">#}
{# {{ children }}#}
{# </ul>#}
{# {% endif %}#}
{# </li>#}
{# {% endrecursetree %}#}
{#</ul>#}
{{ root }}
{% for ch in children %}
<h3>{{ ch }}</h3>
{% for ch1 in ch.get_children %}
{{ ch1 }}
{% endfor %}
{% endfor %}
{% endblock %}

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,8 @@
from django.conf import urls
# from django.contrib.auth.views import login, logout
from .views import SpecListView
urlpatterns = [
urls.url(r'^$', SpecListView.as_view(), name='spec-list'),
]

@ -0,0 +1,16 @@
from django.shortcuts import render
from django.views.generic import ListView
from .models import Specialization
class SpecListView(ListView):
model = Specialization
def get_context_data(self, **kwargs):
context = super(SpecListView, self).get_context_data(**kwargs)
root = Specialization.objects.get(pk=1)
context['root'] = root
context['children'] = root.get_children()
context['roots'] = Specialization.objects.root_nodes()
return context

@ -0,0 +1,24 @@
{% extends 'base.html' %}
{% block content %}
<h1>Вход на сайт</h1>
<form method="post" action="">
{% csrf_token %}
{{ form.errors }}
<div class="form-group row">
<div class="col-md-6">
<input type="email" name="{{ form.username.name }}" class="col-xs-6 form-control" id="inputEmail" placeholder="Электронная почта">
</div>
</div>
<div class="form-group row">
<div class="col-md-6">
<input type="password" name="{{ form.password.name }}" class="col-xs-6 form-control" id="inputEmail" placeholder="Пароль">
</div>
</div>
{# {{ form.as_p }}#}
<input type="submit" value="Вход" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}

@ -0,0 +1,13 @@
{% extends 'base.html' %}
{% block content %}
<h1>Регистрация</h1>
<form action="" method="post">
{% for field in form %}
<div class="row">
{{ field.label }}
{{ field }}
</div>
{% endfor %}
<input type="submit" value="Зарегистрировать">
</form>
{% endblock %}

@ -1,11 +0,0 @@
import requests
urls = [
"https://habrahabr.ru/all/",
"https://pythondigest.ru/feed/"
]
for url in urls:
req_info = requests.get(url)
print(req_info.encoding)
print(req_info.text)

@ -1,4 +1,5 @@
from django.contrib import admin
from guardian.admin import GuardedModelAdmin
from .models import CustomUser
admin.site.register(CustomUser)
admin.site.register(CustomUser, GuardedModelAdmin)

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-05-11 11:35
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='customuser',
name='firstname',
field=models.CharField(blank=True, max_length=255),
),
migrations.AddField(
model_name='customuser',
name='lastname',
field=models.CharField(blank=True, max_length=255),
),
]

@ -2,6 +2,7 @@ from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None):
@ -19,7 +20,22 @@ class CustomUserManager(BaseUserManager):
user.save(using=self._db)
return user
class PerformUserManager(models.Manager):
def get_queryset(self):
return super(PerformUserManager, self).get_queryset().filter(groups__name='Исполнитель')
class CustomerUserManager(models.Manager):
def get_queryset(self):
return super(CustomerUserManager, self).get_queryset().filter(groups__name='Заказчик')
class CustomUser(AbstractBaseUser, PermissionsMixin):
firstname = models.CharField(max_length=255, blank=True)
lastname = 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)
@ -34,7 +50,8 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
def get_short_name(self):
return self.email
def get_full_name(self):
return self.firstname + ' ' + self.lastname
# def has_perm(self, perm, obj=None):
# perm = perm.split('.')[-1]
@ -46,8 +63,7 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
#
def has_perm(self, perm, obj=None):
return False
return True
def has_module_perms(self, app_label):
return self.is_admin
@ -55,6 +71,8 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
perform_objects = PerformUserManager()
customers_objects = CustomerUserManager()

@ -0,0 +1,15 @@
{% extends "base.html" %}
{% block content %}
<h2>Исполнители</h2>
{% for perf in performers %}
<h1>{{ perf }}</h1>
{% endfor %}
<h2>Заказчики</h2>
{% for cust in customers %}
<h1>{{ cust }}</h1>
{% endfor %}
{% endblock %}

@ -1,7 +1,61 @@
{% extends "base.html" %}
{% block content %}
<h1>Пользователи</h1>
{% for user in users %}
<h3>{{ user }}</h3>
{% endfor %}
<div class="titleBlockComparison disTab">
<div class="triangle1"></div>
<p>Дизайн интерьера квартиры 200m2</p>
<table class="compTable">
<tbody><tr>
<th></th>
<th>Кандидат</th>
<th>Цена</th>
<th>Срок</th>
<th>Описание</th>
<th>Рейтинги/отзывы</th>
<th>Безопасные сделки</th>
<th>Решение</th>
</tr>
{% for user in users %}
<tr>
<td>1</td>
<td>
{{ user.get_full_name }}
</td>
<td>35 000 <i class="fa fa-rub"></i></td>
<td>
3<br> <span>недели</span>
</td>
<td>
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
</td>
<td>
<ul>
<li><span>23 560</span></li>
<li>
<span>+385</span>
0
<small> - 0</small>
</li>
<li>
СРО
</li>
</ul>
</td>
<td>
<span>5</span><br>
Готов работать по безопасной сделке
</td>
<td>
<div class="tableButtons disTab">
<div class="btnTab btnTab1"></div>
<div class="btnTab btnTab2"></div>
<div class="btnTab btnTab3"></div>
<div class="btnTab btnTab4"></div>
</div>
</td>
</tr>
{% endfor %}
</tbody></table>
</div>
{% endblock %}

@ -0,0 +1,8 @@
from django import template
register = template.Library()
@register.filter('has_group')
def has_group(user, group_name):
groups = user.groups.all().values_list('name', flat=True)
return True if group_name in groups else False

@ -1,11 +1,12 @@
from django.conf import urls
from django.contrib.auth.views import login, logout
from .views import UserListView , UserDetailView
from .views import UserListView, UserDetailView, UserInfoListView
urlpatterns = [
urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'),
# urls.url(r'^login/?$', login, {'template_name': 'users/login.html'}),
# urls.url(r'^logout/?$', logout),
urls.url(r'^$', UserListView.as_view(), name='users_list'),
urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'),
]

@ -1,4 +1,5 @@
from django.shortcuts import render
from django.contrib.auth.models import Group
from django.views.generic import ListView, DetailView
from .models import CustomUser
@ -8,5 +9,17 @@ class UserListView(ListView):
template_name = 'users/users_list.html'
context_object_name = 'users'
class UserInfoListView(ListView):
model = CustomUser
template_name = 'users/users_info_list.html'
def get_context_data(self, **kwargs):
context = super(UserInfoListView, self).get_context_data(**kwargs)
context['groups'] = Group.objects.all()
context['performers'] = CustomUser.perform_objects.all()
context['customers'] = CustomUser.customers_objects.all()
return context
class UserDetailView(DetailView):
model = CustomUser
Loading…
Cancel
Save