diff --git a/projects/templates/project_detail.html b/projects/templates/project_detail.html index 7ef1f30..bfb462e 100644 --- a/projects/templates/project_detail.html +++ b/projects/templates/project_detail.html @@ -244,7 +244,7 @@

Опубликован: {{ answer.created|date:'M d, Y' }}

-
+ {% csrf_token %} отказ @@ -321,7 +321,7 @@
{% else %} - + {% csrf_token %} @@ -333,28 +333,28 @@
-
+
-

Стоимость {{ form.budget.errors.as_text }}

+

Стоимость {{ form.budget.errors.as_text }}

-
+

{{ form.currency.errors.as_text }}

{{ form.currency }}
-
+

Срок {{ form.term.errors.as_text }}

-
+

{{ form.term_type.errors.as_text }}

{{ form.term_type }} @@ -363,7 +363,7 @@
-
+

Текст {{ form.text.errors.as_text }}

@@ -383,20 +383,24 @@
-
+

Портфолио {{ form.portfolios.errors.as_text }}

    {% for p in form.portfolios.field.queryset.all %}
  • - + - {{ p.name }} +

    {{ p.name }}

  • {% endfor %}
@@ -404,7 +408,7 @@
-
+
Не более 10 файлов общим объемом до 500 Мб @@ -422,14 +426,22 @@
-
- {{ form.secure_deal_only }} {{ form.secure_deal_only.label }} +
+
+ +

{{ form.secure_deal_only.label }}

+
-
- +
+
+ +
@@ -543,12 +555,16 @@ Кандидат + предложить проект - - отказ - + + + {% csrf_token %} + + отказ +
diff --git a/projects/urls.py b/projects/urls.py index e99ee89..9044f0e 100644 --- a/projects/urls.py +++ b/projects/urls.py @@ -13,6 +13,7 @@ from .views import ( CustomerProjectEditView, CustomerProjectRestoreView, CustomerProjectTrashView, + CustomerRejectProjectAnswerView, OfferOrderView, ProjectAnswerCreateMessageView, ProjectComparisonView, @@ -37,7 +38,8 @@ urlpatterns = [ urls.url(r'^(?P\d+)/delete/$', CustomerProjectDeleteView.as_view(), name='customer-project-delete'), urls.url(r'^create-answer-message/(?P\d+)/$', ProjectAnswerCreateMessageView.as_view(), name='create-answer-message'), - urls.url(r'^(?P\d+)/contractor-reject-project-answer/(?P\d+)/$', ContractorRejectProjectAnswerView.as_view(), name='contractor-reject-project-answer'), + urls.url(r'^contractor-reject-project-answer/(?P\d+)/$', ContractorRejectProjectAnswerView.as_view(), name='contractor-reject-project-answer'), + urls.url(r'^customer-reject-project-answer/(?P\d+)/$', CustomerRejectProjectAnswerView.as_view(), name='customer-reject-project-answer'), urls.url(r'^portfolio/create/$', contractor_portfolio_create, name='contractor-portfolio-create'), urls.url(r'^portfolio/(?P\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'), diff --git a/projects/views.py b/projects/views.py index 6a00b0f..9aa48fb 100644 --- a/projects/views.py +++ b/projects/views.py @@ -139,10 +139,19 @@ class ProjectAnswerCreateMessageView(BaseMixin, View): message = form.save(commit=False) if request.user.is_contractor(): - answer = get_object_or_404(request.user.contractor_answers, pk=kwargs.get('pk')) + answer = get_object_or_404(Answer, pk=kwargs.get('pk')) + message.answer = answer message.is_sender_customer = False - message.contractor_or_team = request.user + + if isinstance(answer.author, User) and answer.author == request.user: + message.contractor_or_team = request.user + elif isinstance(answer.author, Team): + try: team = request.user.team + except Team.DoesNotExist: team = None + + if team and answer.author == team: + message.contractor_or_team = team elif request.user.is_customer(): answer = get_object_or_404(Answer, pk=kwargs.get('pk')) # TODO: Perform additional checks message.answer = answer @@ -164,8 +173,6 @@ class ProjectAnswerCreateMessageView(BaseMixin, View): class ContractorRejectProjectAnswerView(BaseMixin, View): - # form_class = ContractorRejectProjectAnswerForm - def dispatch(self, request, *args, **kwargs): if request.user.is_authenticated() and request.user.is_contractor(): return super().dispatch(request, *args, **kwargs) @@ -173,41 +180,31 @@ class ContractorRejectProjectAnswerView(BaseMixin, View): return HttpResponseForbidden('403 Forbidden') def post(self, request, *args, **kwargs): - # form = self.form_class(request.POST, request=request) - # - # if form.is_valid(): - # message = form.save(commit=False) - # - # if request.user.is_contractor(): - # answer = get_object_or_404(request.user.contractor_answers, pk=kwargs.get('pk')) - # message.answer = answer - # message.is_sender_customer = False - # message.contractor_or_team = request.user - # elif request.user.is_customer(): - # answer = get_object_or_404(Answer, pk=kwargs.get('pk')) # TODO: Perform additional checks - # message.answer = answer - # message.is_sender_customer = True - # - # message.save() - # form.save_m2m() - # - # messages.info(request, 'Сообщение успешно размещено') - # else: - # if form.errors: - # messages.info(request, ( - # '

Произошла ошибка (form)

' - # '
{form}
' - # ).format(form=pformat(form.errors))) - - # contractor = request.user - # - # projects = contractor.projects - # - # contractor.contractor_answers.filter(project=project).first() - # - # project = get_object_or_404(request.user.contractor_answers, pk=kwargs.get('pk')) - - messages.info(request, 'OKOK') + answer = get_object_or_404(request.user.contractor_answers, pk=kwargs.get('pk')) + answer.delete() + + messages.info(request, 'Вы успешно отказались от проекта') + + redirect_to = request.POST.get('next') + return redirect(redirect_to) + + +class CustomerRejectProjectAnswerView(BaseMixin, View): + def dispatch(self, request, *args, **kwargs): + if request.user.is_authenticated() and request.user.is_customer(): + return super().dispatch(request, *args, **kwargs) + else: + return HttpResponseForbidden('403 Forbidden') + + def post(self, request, *args, **kwargs): + answer_id = kwargs.get('pk') + + project = get_object_or_404(request.user.projects, answers__pk=answer_id) + answer = get_object_or_404(project.answers, pk=answer_id) + + answer.delete() + + messages.info(request, 'Вы успешно отказали пользователю в проекте') redirect_to = request.POST.get('next') return redirect(redirect_to) diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..dc25eff --- /dev/null +++ b/update.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +source ../env/bin/activate && +git reset --hard && +git pull && +./manage.py migrate --noinput && +./manage.py collectstatic --noinput && +supervisorctl restart arch \ No newline at end of file