Add project answer view and Project model changes

remotes/origin/setup
Mukhtar 10 years ago
parent 8d5d51b810
commit 4792728ca8
  1. 15
      assets/css/extra.css
  2. 29
      projects/forms.py
  3. 20
      projects/migrations/0029_project_active.py
  4. 30
      projects/migrations/0030_auto_20160610_1430.py
  5. 24
      projects/migrations/0031_auto_20160610_1434.py
  6. 20
      projects/models.py
  7. 6
      projects/templates/contractor_project_detail.html
  8. 4
      projects/templates/customer_project_create.html
  9. 18
      projects/templates/projects/project_list.html
  10. 9
      projects/urls.py
  11. 13
      projects/views.py

@ -14,3 +14,18 @@
.btn-group.valProject2 a.btn > span {
padding-left: 11px;
}
.btn-submit-link {
border-radius: 40px;
font-family: 'pfdintextcomppro-regular', sans-serif;
color: black;
font-size: 16px;
padding: 17px 33px 17px 33px;
float: left;
margin: 0 15px 48px 15px;
border: 1px solid #DFDFDF;
text-transform: uppercase;
letter-spacing: 2px;
color: #42B476;
border: 1px solid #42B476;
}

@ -67,28 +67,27 @@ class PortfolioForm(ModelForm):
class AnswerForm(ModelForm):
def __init__(self, *args, **kwargs):
# import code; code.interact(local=dict(globals(), **locals()))
self.project_id = kwargs.pop('project_id')
super().__init__(*args, **kwargs)
self.fields["project"].initial = self.project_id
# def __init__(self, *args, **kwargs):
# # import code; code.interact(local=dict(globals(), **locals()))
# self.project_id = kwargs.pop('project_id')
# super().__init__(*args, **kwargs)
# self.fields["project"].initial = self.project_id
class Meta:
model = Answer
fields = (
# 'cost',
# 'cost_type',
# 'term',
# 'term_type',
# 'text',
'budget',
'currency',
'term',
'term_type',
'text',
)
# widgets = {
# # 'project': HiddenInput(),
# 'cost_type': Select(attrs={'class':'selectpicker'}),
# 'term_type': Select(attrs={'class':'selectpicker'}),
# }
widgets = {
'currency': Select(attrs={'class':'selectpicker'}),
'term_type': Select(attrs={'class':'selectpicker'}),
}
class StageForm(ModelForm):
class Meta:

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-10 11:16
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0028_auto_20160610_1301'),
]
operations = [
migrations.AddField(
model_name='project',
name='active',
field=models.BooleanField(default=True),
),
]

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-10 11:30
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('projects', '0029_project_active'),
]
operations = [
migrations.RenameField(
model_name='answer',
old_name='cost',
new_name='budget',
),
migrations.RenameField(
model_name='answer',
old_name='user',
new_name='contractor',
),
migrations.RenameField(
model_name='answer',
old_name='cost_type',
new_name='currency',
),
]

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-10 11:34
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0030_auto_20160610_1430'),
]
operations = [
migrations.RemoveField(
model_name='project',
name='active',
),
migrations.AddField(
model_name='project',
name='state',
field=models.CharField(choices=[('active', 'Активный'), ('trash', 'В корзине'), ('delete', 'Удален')], default='active', max_length=20),
),
]

@ -89,6 +89,12 @@ class Project(models.Model):
('secure_deal', 'Безопасная сделка (с резервированием бюджета) '),
('direct_payment', 'Прямая оплата Исполнителю на его кошелек/счет'),
)
STATES = (
('active', 'Активный'),
('trash', 'В корзине'),
('delete', 'Удален'),
)
budget = models.DecimalField(max_digits=10, decimal_places=0)
budget_by_agreement = models.BooleanField(default=False)
@ -105,6 +111,7 @@ class Project(models.Model):
term_type = models.CharField(max_length=20, choices=TERMS, default='hour')
text = models.TextField(blank=True)
work_type = models.CharField(default='1', max_length=20, choices=WORK_TYPES)
state = models.CharField(default='active', max_length=20, choices=STATES)
def __str__(self):
return self.name
@ -113,6 +120,11 @@ class Project(models.Model):
verbose_name = 'Проект'
verbose_name_plural = 'Проекты'
def secure_deal(self):
if self.deal_type == 'secure_deal':
return True
return False
class ProjectFile(models.Model):
file = models.FileField(upload_to='projects/project_files')
@ -124,14 +136,14 @@ class ProjectFile(models.Model):
class Answer(models.Model):
cost = models.DecimalField(max_digits=10, decimal_places=0)
cost_type = models.CharField(max_length=5, choices=CURRENCIES, default='rur')
budget = models.DecimalField(max_digits=10, decimal_places=0)
currency = models.CharField(max_length=5, choices=CURRENCIES, default='rur')
created = models.DateTimeField(default=timezone.now)
project = models.ForeignKey(Project, related_name='answers')
term = models.IntegerField(default=0)
term_type = models.CharField(max_length=10, choices=TERMS, default='hour')
text = models.TextField()
user = models.ForeignKey(User, related_name='answers')
contractor = models.ForeignKey(User, related_name='answers')
def __str__(self):
return self.text
@ -144,7 +156,7 @@ class Answer(models.Model):
class Order(models.Model):
contractor = models.ForeignKey(User, null=True, blank=True)
created = models.DateTimeField(default=timezone.now, editable=False)
created = models.DateTimeField(default=timezone.now)
project = models.OneToOneField(Project, related_name='order')
secure = models.BooleanField(default=False)
status = models.BooleanField(default=False)

@ -81,7 +81,7 @@
</div>
<div class="col-lg-10 col-lg-offset-1">
<p class="textProIn">
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.
{{ project.text }}
</p>
</div>
<div class="col-lg-10 col-lg-offset-1">
@ -108,7 +108,7 @@
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Стоимость</p>
<input type="text" class="box-sizing" name="{{ form.cost.name }}"/>
<input type="text" class="box-sizing" name="{{ form.budget.name }}"/>
</div>
</div>
@ -116,7 +116,7 @@
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Бюджет</p>
{{ form.cost_type }}
{{ form.currency }}
</div>
</div>

@ -185,9 +185,7 @@
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input style="border-radius: 40px;font-family: 'pfdintextcomppro-regular', sans-serif;
color: black;font-size: 16px;padding: 17px 33px 17px 33px;float: left;margin: 0 15px 48px 15px;border: 1px solid #DFDFDF;text-transform: uppercase;
letter-spacing: 2px;color: #42B476;border: 1px solid #42B476" type="submit" value="Разместить проект"/>
<input class="btn-submit-link" type="submit" value="Разместить проект"/>
<a href="javascript:void(0)">Сохранить</a>
</div>

@ -132,7 +132,7 @@
<span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>
</a>
<a href="javascript:void(0)">
рейтенгу
рейтингу
<span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>
</a>
<a href="javascript:void(0)">
@ -161,7 +161,7 @@
Объект "{{ proj.realty.name }}"
</li>
<li>
<span>2</span> ответ от имени группы
<span>0</span> ответ от имени группы
</li>
</ul>
<p class="textPro">
@ -172,10 +172,10 @@
{{ proj.created }}
</li>
<li>
523
0
</li>
<li>
523
0
</li>
<li>
{{ proj.user }}
@ -184,17 +184,17 @@
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ proj.price }} <i class="fa fa-rub"></i>
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
<li>
Безопасная сделка
</li>
{% if proj.secure_deal %}
<li>Безопасная сделка</li>
{% endif %}
<li>
Стадия: "П"
</li>
<li>
Отказаться и перемстить
Отказаться и переместить
в корзину
</li>
</ul>

@ -1,9 +1,10 @@
from django.conf import urls
from django.views.generic import TemplateView
from .views import ProjectsView, ProjectDetailView, ProjectCreateView, \
ProjectComparisonView, add_candidate, ChatView, OfferOrderView
from .views import (
ProjectsView, ProjectView, ProjectCreateView,
ProjectComparisonView, add_candidate, ChatView, OfferOrderView,
)
app_name = 'projects'
@ -13,7 +14,7 @@ urlpatterns = [
urls.url(r'^candidate/comparison/(?P<pk>\d+)$', ProjectComparisonView.as_view(), name='comparison'),
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<pk>\d+)$', ProjectDetailView.as_view(), name='detail'),
urls.url(r'(?P<pk>\d+)$', ProjectView.as_view(), name='detail'),
urls.url(r'chat/$', ChatView.as_view(), name='chat'),
urls.url(r'offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'),
]

@ -7,7 +7,7 @@ from django.views.generic.edit import FormMixin
from users.models import User
from .models import Project, Portfolio, Candidate, Answer, Realty
from .models import Project, Portfolio, Candidate, Answer, Realty, Order
from .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm
from .mixins import LastAccessMixin
@ -21,7 +21,7 @@ class ProjectsView(ListView):
return context
class ProjectDetailView(LastAccessMixin, FormMixin, View):
class ProjectView(LastAccessMixin, FormMixin, View):
model = Project
form_class = AnswerForm
template_name = 'contractor_project_detail.html'
@ -29,11 +29,6 @@ class ProjectDetailView(LastAccessMixin, FormMixin, View):
def get_success_url(self):
return reverse('projects:detail', kwargs={'pk': self.object.pk})
def get_form_kwargs(self, **kwargs):
kwargs = super().get_form_kwargs(**kwargs)
kwargs.update({'project_id': self.object.pk})
return kwargs
def get(self, request, *args, **kwargs):
if request.user.is_customer():
self.template_name = 'customer_project_detail.html'
@ -51,9 +46,11 @@ class ProjectDetailView(LastAccessMixin, FormMixin, View):
def form_valid(self, request, form, project):
answer = form.save(commit=False)
answer.user = request.user
answer.contractor = request.user
answer.project = project
answer.save()
order = Order.objects.create(project=project)
return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.id}))

Loading…
Cancel
Save