import dal_queryset_sequence
import dal_select2_queryset_sequence
+
+from django import forms
+from django.forms.widgets import HiddenInput
+from django.forms import ModelForm
from mezzanine.core.models import Orderable
from organization.magazine.models import Article, Topic, Brief
from organization.pages.models import CustomPage
-# from mezzanine_agenda.models import Event
-from organization.pages.models import DynamicContentHomeSlider, DynamicContentHomeBody
+from organization.pages.models import DynamicContentHomeSlider, DynamicContentHomeBody, JobResponse
class DynamicContentHomeSliderForm(autocomplete.FutureModelForm):
content_object = dal_queryset_sequence.fields.QuerySetSequenceModelField(
queryset=autocomplete.QuerySetSequence(
Article.objects.all(),
- # Event.objects.all(),
CustomPage.objects.all(),
),
required=False,
widget=dal_select2_queryset_sequence.widgets.QuerySetSequenceSelect2('dynamic-content-home-slider'),
)
- # js = [static("mezzanine/js/admin/dynamic_inline.js")]
class Meta:
model = DynamicContentHomeSlider
content_object = dal_queryset_sequence.fields.QuerySetSequenceModelField(
queryset=autocomplete.QuerySetSequence(
Article.objects.all(),
- # Event.objects.all(),
CustomPage.objects.all(),
Brief.objects.all(),
),
class Meta:
model = DynamicContentHomeBody
fields = ('content_object',)
+
+
+class JobResponseForm(ModelForm):
+
+ def __init__(self, *args, **kwargs):
+ super(JobResponseForm, self).__init__(*args, **kwargs)
+ self.fields['job_offer'].widget = forms.HiddenInput()
+
+ class Meta:
+ model = JobResponse
+ fields = ['first_name', 'last_name', 'email', 'curriculum_vitae', 'cover_letter', 'job_offer']
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-09-07 13:29
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-pages', '0004_auto_20160907_1153'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='jobresponse',
+ name='job_offer',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='job_response', to='organization-pages.JobOffer', verbose_name='job offer'),
+ ),
+ ]
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-09-08 08:32
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sites', '0002_alter_domain_unique'),
+ ('organization-pages', '0005_auto_20160907_1529'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='jobresponse',
+ name='site',
+ field=models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.Site'),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name='jobresponse',
+ name='slug',
+ field=models.CharField(blank=True, help_text='Leave blank to have the URL auto-generated from the title.', max_length=2000, null=True, verbose_name='URL'),
+ ),
+ migrations.AddField(
+ model_name='jobresponse',
+ name='title',
+ field=models.CharField(default='job', max_length=500, verbose_name='Title'),
+ preserve_default=False,
+ ),
+ ]
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-09-08 13:18
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-pages', '0006_auto_20160908_1032'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='jobresponse',
+ name='cover_letter',
+ field=models.FileField(max_length=1024, upload_to='job_responses/%Y/%m/%d/', verbose_name='cover letter'),
+ ),
+ migrations.AlterField(
+ model_name='jobresponse',
+ name='curriculum_vitae',
+ field=models.FileField(max_length=1024, upload_to='job_responses/%Y/%m/%d/', verbose_name='curriculum vitae'),
+ ),
+ ]
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-09-08 14:02
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-pages', '0007_auto_20160908_1518'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='jobresponse',
+ name='site',
+ ),
+ migrations.RemoveField(
+ model_name='jobresponse',
+ name='slug',
+ ),
+ migrations.RemoveField(
+ model_name='jobresponse',
+ name='title',
+ ),
+ ]
last_name = models.CharField(max_length=255, null=False, verbose_name=_('last name'))
email = models.EmailField(max_length=255, null=False, verbose_name=_('email'))
#@TODO validate type format
- curriculum_vitae = FileField(_("curriculum_vitae"), max_length=1024, upload_to="job_responses/%Y/%m/%d/")
- cover_letter = FileField(_("curriculum_vitae"), max_length=1024, upload_to="job_responses/%Y/%m/%d/")
- job_offer = models.ForeignKey("JobOffer", verbose_name=_('job offer'), blank=True, null=True, on_delete=models.SET_NULL)
+ curriculum_vitae = models.FileField(_("curriculum vitae"), max_length=1024, upload_to="job_responses/%Y/%m/%d/")
+ cover_letter = models.FileField(_("cover letter"), max_length=1024, upload_to="job_responses/%Y/%m/%d/")
+ job_offer = models.ForeignKey("JobOffer", verbose_name=_('job offer'), related_name='job_response', blank=True, null=True, on_delete=models.SET_NULL)
class Meta:
verbose_name = _('job_reponse')
email = models.EmailField(max_length=255, null=False, verbose_name=_('Email to forward response'))
type = models.CharField(blank=True, choices=[('internship', 'internship'), ('job', 'job')], max_length=32, verbose_name='Job offer type')
+ def get_absolute_url(self):
+ return reverse("organization-job-offer-detail", kwargs={"slug": self.slug})
+
class Meta:
verbose_name = _('job offer')
verbose_name_plural = _("job offers")
-
- def get_absolute_url(self):
- return reverse("organization-job-offer-detail")
DynamicContentHomeSliderView,
DynamicContentHomeBodyView,
HomeView,
- JobOfferDetailView
+ JobOfferDetailView,
+ JobOfferListView,
+ # JobResponseCreate
)
_slash = "/" if settings.APPEND_SLASH else ""
url("^dynamic-content-home-slider/$", DynamicContentHomeSliderView.as_view(), name='dynamic-content-home-slider'),
url("^dynamic-content-home-body/$", DynamicContentHomeBodyView.as_view(), name='dynamic-content-home-body'),
url("^home/$", HomeView.as_view(), name='organization-home'),
- url("^job-offer/(?P<slug>.*)%s$", JobOfferDetailView.as_view(), name='organization-job-offer-detail'),
+ url("^job-offer/(?P<slug>.*)%s$" % _slash, JobOfferDetailView.as_view(), name='organization-job-offer-detail'),
+ url("^job-offer/$", JobOfferListView.as_view(), name='organization-job-offer-list'),
+ #url(r'job-response/add/$', JobResponseCreate.as_view(), name='job-response-add'),
]
from django.shortcuts import render
from django.views.generic import DetailView, ListView, TemplateView
+from django.views.generic.edit import CreateView
+from django.contrib import messages
from dal import autocomplete
from dal_select2_queryset_sequence.views import Select2QuerySetSequenceView
+from django.core.urlresolvers import reverse, reverse_lazy
+from django.utils.translation import ugettext_lazy as _
# from mezzanine_agenda.models import Event
from organization.pages.models import CustomPage
from organization.core.views import SlugMixin
from organization.magazine.models import Article, Topic, Brief
-from organization.pages.models import Home, JobOffer
-
+from organization.pages.models import Home, JobOffer, JobResponse
+from organization.pages.forms import JobResponseForm
class HomeView(SlugMixin, ListView):
return context
-class JobOfferDetailView(SlugMixin, DetailView):
+class JobOfferDetailView(CreateView):
- model = JobOffer
- template_name='pages/job_offer_detail.html'
+ model = JobResponse
+ template_name='pages/joboffer/job_offer_detail.html'
context_object_name = 'job_offer'
+ form_class = JobResponseForm
def get_context_data(self, **kwargs):
context = super(JobOfferDetailView, self).get_context_data(**kwargs)
+ job_offer = JobOffer.objects.get(slug=self.kwargs['slug'])
+ if job_offer :
+ context['job_offer'] = job_offer
return context
+ def get_initial(self):
+ initial = super(JobOfferDetailView, self).get_initial()
+ job_offer = JobOffer.objects.get(slug=self.kwargs['slug'])
+ if job_offer :
+ initial['job_offer'] = job_offer
+ return initial
+
+ def get_success_url(self):
+ return reverse_lazy('organization-job-offer-detail', kwargs={'slug':self.kwargs['slug']})
+
+ def form_valid(self, form):
+ messages.info(self.request, _("You have successfully submitted your application."))
+ return super(JobOfferDetailView, self).form_valid(form)
+
+
+class JobOfferListView(ListView):
+
+ model = JobOffer
+ template_name='pages/joboffer/job_offer_list.html'
+ context_object_name = 'job_offer'
+
+ def get_queryset(self, **kwargs):
+ return self.model.objects.published()
+
+ def get_context_data(self, **kwargs):
+ context = super(JobOfferListView, self).get_context_data(**kwargs)
+ return context
+
+
+# class JobResponseCreate(CreateView):
+#
+# template_name = 'pages/joboffer/inc/job_response_form.html'
+# model = JobResponse
+# # form_class = JobResponseForm
+# fields = ['first_name', 'last_name', 'email', 'curriculum_vitae', 'cover_letter']
+# # success_url = '/job-offer-success/'
+#
+# def form_valid(self, form):
+# # This method is called when valid form data has been POSTed.
+# # It should return an HttpResponse.
+# # form.send_email()
+# return super(JobResponseView, self).form_valid(form)
+
class DynamicContentHomeSliderView(Select2QuerySetSequenceView):
def get_queryset(self):
--- /dev/null
+{% if messages %}
+<ul class="messages">
+ {% for message in messages %}
+ <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
+ {% endfor %}
+</ul>
+{% endif %}
--- /dev/null
+<a href="{{ jo.get_absolute_url }}" title="{{ jo.title }}">
+ <h2>{{ jo.title }}</h2>
+ <p>{{ jo.description|slice:":255" }}</p>
+</a>
--- /dev/null
+<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
+ {{ form.as_p }}
+ <input type="submit" value="Send message" />
+</form>
--- /dev/null
+{% extends "pages/page.html" %}
+{% load mezzanine_tags keyword_tags i18n organization_tags %}
+
+
+{% block page_title %}
+
+ {% editable project.title %}
+ <h1 class="dotted">{{ job_offer.title }}</h1>
+ {% endeditable %}
+
+{% endblock %}
+
+{% block page_content %}
+
+ {% include "core/inc/messages.html" %}
+
+ <p>{% trans "Category" %} : {{ job_offer.type }}</p>
+ <p>{{ job_offer.content|richtext_filters|safe }}</p>
+ {% with form as job_offer.job_response %}
+ {% include "pages/joboffer/inc/job_response_form.html" %}
+ {% endwith %}
+{% endblock %}
--- /dev/null
+{% extends "pages/page.html" %}
+{% load i18n mezzanine_tags keyword_tags pages_tags organization_tags %}
+
+{% block meta_title %}{{ job_offer.meta_title }}{% endblock %}
+
+{% block meta_description %}{% metablock %}
+{{ job_offer.description }}
+{% endmetablock %}{% endblock %}
+
+{% block page_class %}
+ job_offer
+{% endblock %}
+
+{% block page_title %}
+ <h1 class="dashed">{% trans "Jobs" %}</h1>
+{% endblock %}
+
+{% block page_content %}
+ {% if job_offer %}
+ {% for jo in job_offer %}
+ {% include "pages/joboffer/inc/job_offer_card.html" %}
+ {% endfor %}
+ {% else %}
+ <p>{% trans "Please come back later. There is no job offer at the moment." %}</p>
+ {% endif %}
+
+{% endblock %}