eviltnan/freeturn

View on GitHub
crm/wagtail_admin/cv.py

Summary

Maintainability
A
0 mins
Test Coverage
A
94%
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.utils.decorators import method_decorator
from wagtail.admin.edit_handlers import ObjectList
from wagtail.contrib.modeladmin.mixins import ThumbnailMixin
from wagtail.contrib.modeladmin.options import ModelAdmin
from wagtail.contrib.modeladmin.views import CreateView, InspectView, EditView
from wagtail.core.models import Site

from crm.models.cv import CV
from crm.models.project import Project
from crm.models.settings import CVGenerationSettings
from crm.utils import BasePDFView


class CreateCVView(CreateView):
    def get_edit_handler(self):
        if hasattr(self.model, 'edit_handler'):
            edit_handler = self.model.edit_handler
        else:
            edit_handler = ObjectList(CV.create_panels)
        return edit_handler.bind_to(self.model)

    def get_initial(self):
        site = Site.find_for_request(self.request)
        user = self.request.user
        settings = CVGenerationSettings.for_site(site)
        try:
            for_project = Project.objects.filter(pk=self.request.GET.get('for_project')).first()
        except ValueError:
            for_project = None
        return {
            'title': settings.default_title,
            'experience_overview': settings.default_experience_overview,
            'education_overview': settings.default_education_overview,
            'contact_details': settings.default_contact_details,
            'languages_overview': settings.default_languages_overview,
            'rate_overview': settings.default_rate_overview,
            'working_permit': settings.default_working_permit,
            'full_name': f'{user.first_name} {user.last_name}',
            'picture': settings.default_picture,
            'project': for_project
        }


class CVInspectView(BasePDFView,
                    InspectView):
    template_name = 'cv/body.html'

    def get_context_data(self, **kwargs):
        return {
            **super().get_context_data(**kwargs),
            **self.instance.get_default_file_render_context()
        }

    def get_filename(self):
        return self.instance.get_filename()


class CVEditView(EditView):
    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        response = super().dispatch(request, *args, **kwargs)
        if request.method == 'POST':
            return redirect(
                self.url_helper.get_action_url('edit', self.pk_quoted)
            )
        else:
            return response


class CVAdmin(ThumbnailMixin, ModelAdmin):
    model = CV
    menu_icon = 'fa-id-card'
    menu_label = 'CVs'
    create_view_class = CreateCVView
    list_display = ['admin_thumb', 'project', 'created']
    search_fields = ['project__manager__first_name', 'project__manager__last_name',
                     'project__name', 'project__company__name']
    list_per_page = 10
    list_select_related = ['project']
    ordering = ['-created']
    inspect_view_enabled = True
    inspect_view_class = CVInspectView
    inspect_template_name = CVInspectView.template_name
    thumb_image_field_name = 'logo'
    thumb_default = '/static/img/default_project.png'
    list_display_add_buttons = 'project'
    edit_view_class = CVEditView