diff --git a/archilance/settings/base.py b/archilance/settings/base.py
index a812022..376ea03 100644
--- a/archilance/settings/base.py
+++ b/archilance/settings/base.py
@@ -25,6 +25,7 @@ DJANGO_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'django.contrib.humanize',
]
THIRD_PARTY_APPS = [
diff --git a/data.xlsx b/data.xlsx
new file mode 100644
index 0000000..13dce20
Binary files /dev/null and b/data.xlsx differ
diff --git a/projects/forms.py b/projects/forms.py
index 4117525..f614e95 100644
--- a/projects/forms.py
+++ b/projects/forms.py
@@ -1,5 +1,5 @@
from django import forms
-from django.forms import ModelForm, HiddenInput, Form
+from django.forms import ModelForm, HiddenInput, Form, Select
from django.forms.models import inlineformset_factory
from .models import Project, Portfolio, Answer, Realty, PortfolioPhoto
@@ -60,6 +60,8 @@ class AnswerForm(ModelForm):
)
widgets = {
'project': HiddenInput(),
+ 'cost_type': Select(attrs={'class':'selectpicker'}),
+ 'term_type': Select(attrs={'class':'selectpicker'}),
}
from django.forms.models import inlineformset_factory
diff --git a/projects/migrations/0013_auto_20160602_1203.py b/projects/migrations/0013_auto_20160602_1203.py
new file mode 100644
index 0000000..538672d
--- /dev/null
+++ b/projects/migrations/0013_auto_20160602_1203.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.6 on 2016-06-02 12:03
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('projects', '0012_auto_20160530_1355'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='answer',
+ name='term',
+ field=models.IntegerField(default=0),
+ ),
+ ]
diff --git a/projects/migrations/0014_auto_20160602_1559.py b/projects/migrations/0014_auto_20160602_1559.py
new file mode 100644
index 0000000..40f79c9
--- /dev/null
+++ b/projects/migrations/0014_auto_20160602_1559.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.6 on 2016-06-02 15:59
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('projects', '0013_auto_20160602_1203'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='answer',
+ options={'ordering': ('-created',), 'verbose_name': 'Ответ к проекту', 'verbose_name_plural': 'Ответы к проектам'},
+ ),
+ migrations.AlterField(
+ model_name='order',
+ name='cost',
+ field=models.DecimalField(decimal_places=0, max_digits=10),
+ ),
+ migrations.AlterField(
+ model_name='project',
+ name='price',
+ field=models.DecimalField(decimal_places=0, max_digits=10),
+ ),
+ ]
diff --git a/projects/migrations/0015_auto_20160602_1606.py b/projects/migrations/0015_auto_20160602_1606.py
new file mode 100644
index 0000000..e4caee6
--- /dev/null
+++ b/projects/migrations/0015_auto_20160602_1606.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.6 on 2016-06-02 16:06
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('projects', '0014_auto_20160602_1559'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='answer',
+ name='cost',
+ field=models.DecimalField(decimal_places=0, max_digits=10),
+ ),
+ ]
diff --git a/projects/models.py b/projects/models.py
index 6d23272..5b2ca32 100644
--- a/projects/models.py
+++ b/projects/models.py
@@ -35,7 +35,7 @@ class Project(models.Model):
)
name = models.CharField(max_length=255)
- price = models.DecimalField(max_digits=10, decimal_places=2)
+ price = models.DecimalField(max_digits=10, decimal_places=0)
specialization = models.ForeignKey(Specialization, related_name='projects')
text = models.TextField(blank=True)
user = models.ForeignKey(User, related_name='projects')
@@ -58,7 +58,7 @@ class Project(models.Model):
class Order(models.Model):
project = models.OneToOneField(Project, related_name='order')
contractor = models.ForeignKey(User)
- cost = models.DecimalField(max_digits=10, decimal_places=2)
+ cost = models.DecimalField(max_digits=10, decimal_places=0)
term = models.IntegerField(default=1)
created = models.DateTimeField(default=timezone.now, editable=False)
status = models.BooleanField(default=False)
@@ -84,10 +84,10 @@ class Answer(models.Model):
('month', 'month'),
)
- cost = models.DecimalField(max_digits=10, decimal_places=2)
+ cost = models.DecimalField(max_digits=10, decimal_places=0)
cost_type = models.CharField(max_length=5, choices=COST_TYPE_CHOICES, default='rur')
text = models.TextField()
- term = models.DecimalField(max_digits=10, decimal_places=2)
+ term = models.IntegerField(default=0)
term_type = models.CharField(max_length=10, choices=TERM_TYPE_CHOICES, default='hour')
project = models.ForeignKey(Project, related_name='answers')
user = models.ForeignKey(User, related_name='answers')
@@ -99,6 +99,7 @@ class Answer(models.Model):
class Meta:
verbose_name = 'Ответ к проекту'
verbose_name_plural = 'Ответы к проектам'
+ ordering = ('-created',)
class Candidate(models.Model):
diff --git a/projects/templates/projects/project_detail.html b/projects/templates/projects/project_detail.html
index 503381d..5bce86c 100644
--- a/projects/templates/projects/project_detail.html
+++ b/projects/templates/projects/project_detail.html
@@ -1,13 +1,15 @@
{% extends "base.html" %}
{% block content %}
+ {% load humanize %}
+ {% load l10n %}
- 13.0.2016
+ {{ object.created }}
- Техническое сопровождение
+ {{ object.type_work }}
+ {% if object.secure_transaction %}
-
Есть допуск СРО
+
+
Есть допуск СРО
+
+ {% endif %}
@@ -66,22 +70,19 @@
- Местоположение: Россия, Москва
+ Местоположение: {{ object.realty.country }},{{ object.realty.city }}
- Классификация здания: Коттедж
+ Классификация здания: {{ object.realty.building_classification }}
- Вид строительства: Новое
+ Вид строительства: {{ object.realty.type_construction }}
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin gravida
- dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor. Cum sociis natoque
- penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam fermentum, nulla luctus pharetra
- vulputate, felis tellus mollis orci, sed rhoncus sapien nunc eget odio.
+ {{ object.text }}
@@ -100,28 +101,95 @@
{% if perms.projects.add_answer %}
-
-
Оставить ответ
-
{% endif %}
+
+ {% if not perms.projects.add_answer %}
+
+
+ {% endif %}
+
-
+ {% for answer in object.answers.all %}
+
+
-
Цена:
- 35 000
+
Цена: {{ answer.cost| intcomma }}
- Срок: 3 недели
+ Срок: {{ answer.term }} {{ answer.term_type }}
-
Опубликован: 22.04.2016
+
Опубликован: {{ answer.created }}
-
-
-
- Иванов Петр Иванович
-
-
- 13.0.2016 / 21:05
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin
- gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor.
- Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam
- fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus sapien nunc
- eget odio.
-
-
- Ответить
-
-
-
+ {% endfor %}
+
diff --git a/projects/views.py b/projects/views.py
index ea6bf1f..c84e5a3 100644
--- a/projects/views.py
+++ b/projects/views.py
@@ -52,20 +52,6 @@ class ProjectDetailView(FormMixin, DetailView):
return super().form_valid(form)
-# class ProjectCreateView(CreateView):
-# model = Project
-# # permission_required = ('projects.add_project',)
-# raise_exception = True
-# form_class = ProjectForm
-# success_url = '/projects/' # TODO: Use `reverse_lazy('projects-list')` from `django.core.urlresolvers`
-#
-# def form_valid(self, form):
-# project = form.instance
-# project.user = self.request.user
-# project.save()
-#
-# return super().form_valid(form)
-
class PortfolioCreateView(PermissionRequiredMixin, CreateView):
model = Portfolio
diff --git a/specializations/migrations/0002_auto_20160602_1203.py b/specializations/migrations/0002_auto_20160602_1203.py
new file mode 100644
index 0000000..110b8a5
--- /dev/null
+++ b/specializations/migrations/0002_auto_20160602_1203.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.6 on 2016-06-02 12:03
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('specializations', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='specialization',
+ options={'verbose_name': 'Специализация', 'verbose_name_plural': 'Специализации'},
+ ),
+ ]
diff --git a/templates/base.html b/templates/base.html
index 8bf0bcc..4e9f7a4 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -30,7 +30,7 @@
Биржа проектов
- Мой офис
+ Мой офис
diff --git a/test.py b/test.py
new file mode 100644
index 0000000..d3f7e44
--- /dev/null
+++ b/test.py
@@ -0,0 +1,5 @@
+import xlrd
+rb = xlrd.open_workbook('data.xlsx')
+sheet = rb.sheet_by_index(0)
+for rx in range(sheet.nrows):
+ print(sheet.row(rx))
diff --git a/users/migrations/0009_auto_20160602_1213.py b/users/migrations/0009_auto_20160602_1213.py
new file mode 100644
index 0000000..d614b22
--- /dev/null
+++ b/users/migrations/0009_auto_20160602_1213.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.6 on 2016-06-02 12:13
+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 = [
+ ('users', '0008_auto_20160525_1527'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='user',
+ name='nickname',
+ field=models.CharField(blank=True, max_length=50, null=True),
+ ),
+ migrations.AlterField(
+ model_name='team',
+ name='owner',
+ field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='team', to=settings.AUTH_USER_MODEL),
+ ),
+ ]
diff --git a/users/models.py b/users/models.py
index a3e4908..f6fe5ea 100644
--- a/users/models.py
+++ b/users/models.py
@@ -32,6 +32,7 @@ class CustomerUserManager(models.Manager):
class User(AbstractBaseUser, PermissionsMixin):
+ nickname = models.CharField(max_length=50, blank=True,null=True)
first_name = models.CharField(max_length=255, blank=True)
last_name = models.CharField(max_length=255, blank=True)
email = models.EmailField(max_length=255, unique=True, db_index=True)
diff --git a/users/templates/users/contractor.html b/users/templates/users/contractor.html
index efad0e5..166f23b 100644
--- a/users/templates/users/contractor.html
+++ b/users/templates/users/contractor.html
@@ -2,6 +2,7 @@
{% block content %}
+ {{ object }}
{{ user }}
{{ user.groups.all }}
diff --git a/users/urls.py b/users/urls.py
index 43ef580..21be00a 100755
--- a/users/urls.py
+++ b/users/urls.py
@@ -1,13 +1,16 @@
from django.conf import urls
from django.contrib.auth.views import login, logout
-from .views import UserListView, UserDetailView, UserInfoListView, UserView
+from .views import UserListView, UserDetailView, UserInfoListView, CustomerView, UserView, ContractorDetailView
+
+app_name = 'users'
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'),
- urls.url(r'^contractor/(?P\d+)$$', UserView.as_view(), name='user_view'),
+ urls.url(r'^contractor/(?P\d+)$$', ContractorDetailView.as_view(), name='contactor_view'),
+ urls.url(r'^customer/(?P\d+)$$', CustomerView.as_view(), name='customer_view'),
urls.url(r'^(?P\d+)$', UserView.as_view(), name='user_view'),
]
diff --git a/users/views.py b/users/views.py
index da84eff..0430440 100644
--- a/users/views.py
+++ b/users/views.py
@@ -27,29 +27,41 @@ class UserDetailView(DetailView):
class UserView(View):
- template_name = 'users/contractor.html'
+ pass
+ # template_name = 'users/contractor.html'
+ #
+ # def get(self, request, pk):
+ # user = User.objects.get(pk=pk)
+ # user_group = user.groups.all().first()
+ # if 'Заказчики' in user_group.name:
+ # self.template_name = 'users/customer.html'
+ #
+ # return render(request, self.template_name, {'user': user})
+ # # import code; code.interact(local=dict(globals(), **locals()))
- def get(self, request, pk):
- user = User.objects.get(pk=pk)
- user_group = user.groups.all().first()
- if 'Заказчики' in user_group.name:
- self.template_name = 'users/customer.html'
- return render(request, self.template_name, {'user': user})
- # import code; code.interact(local=dict(globals(), **locals()))
+class UserUpdateView(UpdateView):
+ model = User
+from django.http import Http404
+from django.shortcuts import redirect
-class UserUpdateView(UpdateView):
+class ContractorDetailView(DetailView):
model = User
+ template_name = 'users/contractor.html'
-# class ContractorDetailView(DetailView):
-# model = User
-# template_name = 'users/contractor.html'
-#
-# def get_queryset(self):
-# qs = super().get_queryset()
-# return User.contractor_objects.get(self.pk)
+ def get_object(self, queryset=None):
+ object = super().get_object()
+ user_group = object.groups.all().first()
+ if 'Исполнители' not in user_group.name:
+ return redirect('/projects/')
+ return object
+
+
+class CustomerView(View):
+ template_name = 'users/customer.html'
+
+ def get(self, request, *args, **kwargs):
+ return render(request, self.template_name)
-class CustomerDetailView(DetailView):
- model = User
diff --git a/worksell/migrations/0001_initial.py b/worksell/migrations/0001_initial.py
new file mode 100644
index 0000000..44b56cc
--- /dev/null
+++ b/worksell/migrations/0001_initial.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.6 on 2016-06-02 12:03
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='WorkSell',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=255)),
+ ('description', models.TextField(blank=True)),
+ ('img', models.ImageField(upload_to='worksell/worksell')),
+ ],
+ ),
+ ]