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 { .btn-group.valProject2 a.btn > span {
padding-left: 11px; 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): class AnswerForm(ModelForm):
def __init__(self, *args, **kwargs): # def __init__(self, *args, **kwargs):
# import code; code.interact(local=dict(globals(), **locals())) # # import code; code.interact(local=dict(globals(), **locals()))
self.project_id = kwargs.pop('project_id') # self.project_id = kwargs.pop('project_id')
super().__init__(*args, **kwargs) # super().__init__(*args, **kwargs)
self.fields["project"].initial = self.project_id # self.fields["project"].initial = self.project_id
class Meta: class Meta:
model = Answer model = Answer
fields = ( fields = (
# 'cost', 'budget',
# 'cost_type', 'currency',
# 'term', 'term',
# 'term_type', 'term_type',
# 'text', 'text',
) )
# widgets = { widgets = {
# # 'project': HiddenInput(), 'currency': Select(attrs={'class':'selectpicker'}),
# 'cost_type': Select(attrs={'class':'selectpicker'}), 'term_type': Select(attrs={'class':'selectpicker'}),
# 'term_type': Select(attrs={'class':'selectpicker'}), }
# }
class StageForm(ModelForm): class StageForm(ModelForm):
class Meta: 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', 'Безопасная сделка (с резервированием бюджета) '), ('secure_deal', 'Безопасная сделка (с резервированием бюджета) '),
('direct_payment', 'Прямая оплата Исполнителю на его кошелек/счет'), ('direct_payment', 'Прямая оплата Исполнителю на его кошелек/счет'),
) )
STATES = (
('active', 'Активный'),
('trash', 'В корзине'),
('delete', 'Удален'),
)
budget = models.DecimalField(max_digits=10, decimal_places=0) budget = models.DecimalField(max_digits=10, decimal_places=0)
budget_by_agreement = models.BooleanField(default=False) 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') term_type = models.CharField(max_length=20, choices=TERMS, default='hour')
text = models.TextField(blank=True) text = models.TextField(blank=True)
work_type = models.CharField(default='1', max_length=20, choices=WORK_TYPES) 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): def __str__(self):
return self.name return self.name
@ -113,6 +120,11 @@ class Project(models.Model):
verbose_name = 'Проект' verbose_name = 'Проект'
verbose_name_plural = 'Проекты' verbose_name_plural = 'Проекты'
def secure_deal(self):
if self.deal_type == 'secure_deal':
return True
return False
class ProjectFile(models.Model): class ProjectFile(models.Model):
file = models.FileField(upload_to='projects/project_files') file = models.FileField(upload_to='projects/project_files')
@ -124,14 +136,14 @@ class ProjectFile(models.Model):
class Answer(models.Model): class Answer(models.Model):
cost = models.DecimalField(max_digits=10, decimal_places=0) budget = models.DecimalField(max_digits=10, decimal_places=0)
cost_type = models.CharField(max_length=5, choices=CURRENCIES, default='rur') currency = models.CharField(max_length=5, choices=CURRENCIES, default='rur')
created = models.DateTimeField(default=timezone.now) created = models.DateTimeField(default=timezone.now)
project = models.ForeignKey(Project, related_name='answers') project = models.ForeignKey(Project, related_name='answers')
term = models.IntegerField(default=0) term = models.IntegerField(default=0)
term_type = models.CharField(max_length=10, choices=TERMS, default='hour') term_type = models.CharField(max_length=10, choices=TERMS, default='hour')
text = models.TextField() text = models.TextField()
user = models.ForeignKey(User, related_name='answers') contractor = models.ForeignKey(User, related_name='answers')
def __str__(self): def __str__(self):
return self.text return self.text
@ -144,7 +156,7 @@ class Answer(models.Model):
class Order(models.Model): class Order(models.Model):
contractor = models.ForeignKey(User, null=True, blank=True) 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') project = models.OneToOneField(Project, related_name='order')
secure = models.BooleanField(default=False) secure = models.BooleanField(default=False)
status = models.BooleanField(default=False) status = models.BooleanField(default=False)

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

@ -185,9 +185,7 @@
</div> </div>
<div class="searchF1 polsF1 polsFF links-filter"> <div class="searchF1 polsF1 polsFF links-filter">
<input style="border-radius: 40px;font-family: 'pfdintextcomppro-regular', sans-serif; <input class="btn-submit-link" type="submit" value="Разместить проект"/>
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="Разместить проект"/>
<a href="javascript:void(0)">Сохранить</a> <a href="javascript:void(0)">Сохранить</a>
</div> </div>

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

@ -1,9 +1,10 @@
from django.conf import urls from django.conf import urls
from django.views.generic import TemplateView from django.views.generic import TemplateView
from .views import ProjectsView, ProjectDetailView, ProjectCreateView, \ from .views import (
ProjectComparisonView, add_candidate, ChatView, OfferOrderView ProjectsView, ProjectView, ProjectCreateView,
ProjectComparisonView, add_candidate, ChatView, OfferOrderView,
)
app_name = 'projects' app_name = 'projects'
@ -13,7 +14,7 @@ urlpatterns = [
urls.url(r'^candidate/comparison/(?P<pk>\d+)$', ProjectComparisonView.as_view(), name='comparison'), 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'^create/$', ProjectCreateView.as_view(), name='project-create'),
# urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-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'chat/$', ChatView.as_view(), name='chat'),
urls.url(r'offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'), 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 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 .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm
from .mixins import LastAccessMixin from .mixins import LastAccessMixin
@ -21,7 +21,7 @@ class ProjectsView(ListView):
return context return context
class ProjectDetailView(LastAccessMixin, FormMixin, View): class ProjectView(LastAccessMixin, FormMixin, View):
model = Project model = Project
form_class = AnswerForm form_class = AnswerForm
template_name = 'contractor_project_detail.html' template_name = 'contractor_project_detail.html'
@ -29,11 +29,6 @@ class ProjectDetailView(LastAccessMixin, FormMixin, View):
def get_success_url(self): def get_success_url(self):
return reverse('projects:detail', kwargs={'pk': self.object.pk}) 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): def get(self, request, *args, **kwargs):
if request.user.is_customer(): if request.user.is_customer():
self.template_name = 'customer_project_detail.html' self.template_name = 'customer_project_detail.html'
@ -51,9 +46,11 @@ class ProjectDetailView(LastAccessMixin, FormMixin, View):
def form_valid(self, request, form, project): def form_valid(self, request, form, project):
answer = form.save(commit=False) answer = form.save(commit=False)
answer.user = request.user answer.contractor = request.user
answer.project = project answer.project = project
answer.save() answer.save()
order = Order.objects.create(project=project)
return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.id})) return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.id}))

Loading…
Cancel
Save