Ejemplo n.º 1
0
    def to_table(self, context):
        """This function should be overridden in subclasses and then used like

            class FooReport(BaseReport):
                ...
                def to_table(self, context):

                    # get default rows including description/filters etc
                    rows = super().to_table()

                    # report specific data
                    rows += [
                        [...],
                    ]
        """

        rows = [
            [_("Report Title:"), context['report_title']],
            [_("View On Site:"), self.get_report_url()],
            [_("Report Type:"), context['report_name']],
            [_("Report Description:"), context['report_description']],
            [_("Generated:"), format_datetime(timezone.now())],
            [],
            ["Filters:"],
        ]

        for label, criteria in context['report_details']:
            rows.append([label + ":", criteria])

        if context.get("notes"):
            rows.append(["Notes:"])
            for note in context['notes']:
                rows.append([note['heading'], note['content']])

        return rows
Ejemplo n.º 2
0
    def test_valid_edit_remove_ft(self):
        """Test that editing a fault and modifying a field works"""

        FaultType.objects.create(code="fault type")

        ft1 = utils.create_fault_type()
        ft2 = utils.create_fault_type()
        fault = utils.create_fault(fault_type=[ft1, ft2])
        assert fault.modality is None

        modality = u_models.Modality.objects.create(name="modality")
        fault.unit.modalities.add(modality)

        edit_url = reverse("fault_edit", kwargs={'pk': fault.pk})
        se = sl_utils.create_service_event()
        fault.related_service_events.add(se)

        data = {
            "fault-occurred": format_datetime(fault.occurred),
            "fault-unit": fault.unit.id,
            "fault-modality": modality.pk,
            "fault-fault_types_field": [ft2.code],
            "fault-comment": "",
            "fault-related_service_events": [se.pk],
        }

        assert fault.fault_types.count() == 2
        resp = self.client.post(edit_url, data)
        assert resp.status_code == 302
        fault.refresh_from_db()
        assert fault.modality == modality
        assert fault.fault_types.count() == 1
        assert resp.url == self.list_url
Ejemplo n.º 3
0
    def to_xlsx(self):
        context = self.get_context()
        f = BytesIO()
        wb = xlsxwriter.Workbook(f, {'in_memory': True})
        ws = wb.add_worksheet(name="Report")
        row = 0
        col = 0
        for data_row in self.to_table(context):
            for data in data_row:

                # excel doesn't like urls longer than 255 chars, so write as string instead
                if isinstance(data,
                              str) and "http" in data and len(data) > 255:
                    ws.write_string(row, col, data)
                elif isinstance(data, timezone.datetime):
                    ws.write_string(row, col, format_datetime(data))
                elif isinstance(data, datetime.date):
                    ws.write_string(row, col, format_as_date(data))
                else:
                    try:
                        ws.write(row, col, data)
                    except TypeError:
                        ws.write(row, col, str(data))

                col += 1
            row += 1
            col = 0

        wb.close()
        f.seek(0)
        return f
Ejemplo n.º 4
0
    def test_edit_with_invalid_reviews(self):
        """Test that editing a fault and adding a reviewer works"""

        FaultType.objects.create(code="fault type")

        fault = utils.create_fault(user=self.user)
        rev_group = utils.create_fault_review_group()
        self.user.groups.add(rev_group.group)
        assert fault.modality is None

        modality = u_models.Modality.objects.create(name="modality")
        fault.unit.modalities.add(modality)

        edit_url = reverse("fault_edit", kwargs={'pk': fault.pk})
        se = sl_utils.create_service_event()
        fault.related_service_events.add(se)

        data = {
            "fault-occurred": format_datetime(fault.occurred),
            "fault-unit": fault.unit.id,
            "fault-modality": modality.pk,
            "fault-fault_types_field": [fault.fault_types.first().code],
            "fault-comment": "",
            "fault-related_service_events": [se.pk],
            "review-form-0-group": rev_group.group.name,
            "review-form-0-reviewed_by": "",
        }

        assert fault.faultreviewinstance_set.count() == 0
        resp = self.client.post(edit_url, data)
        assert resp.status_code == 200
        assert resp.context['review_forms'][0].errors['reviewed_by']
Ejemplo n.º 5
0
    def render_to_response(self, context):
        import csv
        response = HttpResponse(content_type='text/csv')
        response[
            'Content-Disposition'] = 'attachment; filename="qatrackexport.csv"'

        writer = csv.writer(response)
        header1 = []
        header2 = []
        for h in context['headers']:
            header1.extend([h.encode('utf-8'), '', ''])
            header2.extend(["Date", "Value", "Ref"])

        writer.writerow(header1)
        writer.writerow(header2)

        tz = timezone.get_current_timezone()
        for row_set in context['rows']:
            row = []
            for date, val, ref in row_set:
                date = format_datetime(date.astimezone(tz)) if date else ""
                row.extend([date, val, ref])
            writer.writerow(row)

        return response
Ejemplo n.º 6
0
    def test_invalid_edit(self):
        """Test that editing a fault and modifying a field works"""

        modality = u_models.Modality.objects.create(name="modality")

        FaultType.objects.create(code="fault type")

        fault = utils.create_fault()
        assert fault.modality is None

        edit_url = reverse("fault_edit", kwargs={'pk': fault.pk})
        se = sl_utils.create_service_event()
        fault.related_service_events.add(se)

        data = {
            "fault-occurred": format_datetime(fault.occurred),
            "fault-unit": '',
            "fault-modality": modality.pk,
            "fault-fault_types_field": [fault.fault_types.first().code],
            "fault-comment": "",
            "fault-related_service_events": [se.pk],
        }

        resp = self.client.post(edit_url, data)
        assert resp.status_code == 200
Ejemplo n.º 7
0
 def __init__(self, *args, **kwargs):
     super(CreateTestListInstanceForm, self).__init__(*args, **kwargs)
     now = timezone.localtime(timezone.now())
     self.fields['work_started'].initial = format_datetime(now)
     self.fields['comment'].widget.attrs['rows'] = '3'
     self.fields['comment'].widget.attrs['placeholder'] = _(
         'Add comment about this set of tests')
     self.fields['comment'].widget.attrs['class'] = 'autosize form-control'
Ejemplo n.º 8
0
    def test_unreviewed_rtsqa(self):

        ses_approved = sl_utils.create_service_event_status(
            name='Approved',
            is_review_required=False,
            rts_qa_must_be_reviewed=True)

        test_status = qa_utils.create_status()
        tl = qa_utils.create_test_list()
        t = qa_utils.create_test()
        qa_utils.create_test_list_membership(tl, t)

        tli_unreviewed = qa_utils.create_test_list_instance(test_list=tl)
        qa_utils.create_test_instance(
            tli_unreviewed,
            unit_test_info=qa_utils.create_unit_test_info(unit=self.u_1),
            status=test_status)

        data = {
            'datetime_service': format_datetime(timezone.now()),
            'unit_field': self.u_1.id,
            'service_area_field': self.sa_1.id,
            'service_type': self.st.id,
            'problem_description': 'problem',
            'service_status': ses_approved.id,
            'hours-INITIAL_FORMS': 0,
            'hours-MAX_NUM_FORMS': 1000,
            'hours-TOTAL_FORMS': 0,
            'hours-MIN_NUM_FORMS': 0,
            'parts-INITIAL_FORMS': 0,
            'parts-MAX_NUM_FORMS': 1000,
            'parts-TOTAL_FORMS': 0,
            'parts-MIN_NUM_FORMS': 0,
            'rtsqa-INITIAL_FORMS': 0,
            'rtsqa-MAX_NUM_FORMS': 1000,
            'rtsqa-TOTAL_FORMS': 1,
            'rtsqa-MIN_NUM_FORMS': 0,
            'rtsqa-0-all_reviewed': tli_unreviewed.all_reviewed,
            'rtsqa-0-unit_test_collection':
            tli_unreviewed.unit_test_collection.id,
            'rtsqa-0-test_list_instance': tli_unreviewed.id,
            'rtsqa-0-id': '',
        }

        response = self.client.post(self.url, data=data)
        self.assertTrue(
            'service_status' in response.context_data['form'].errors)

        data['rtsqa-0-all_reviewed'] = ''
        data['rtsqa-0-test_list_instance'] = ''

        response = self.client.post(self.url, data=data)
        self.assertTrue(
            'service_status' in response.context_data['form'].errors)
def date_to_datestrings(apps, schema):

    TestInstance = apps.get_model("qa", "TestInstance")

    for ti in TestInstance.objects.filter(unit_test_info__test__type="date"):
        ti.string_value = format_as_date(ti.date_value)
        ti.save()

    for ti in TestInstance.objects.filter(unit_test_info__test__type="datetime"):
        ti.string_value = format_datetime(ti.datetime_value)
        ti.save()
Ejemplo n.º 10
0
def service_event_searcher(request):
    q = request.GET.get('q')
    serviceevent = models.ServiceEvent.objects.filter(Q(id__icontains=q))[0:50]
    return JsonResponse({
        'items': [{
            'id':
            se.id,
            'display':
            '{} - Created on {}'.format(se.service_status.name,
                                        format_datetime(se.datetime_service))
        } for se in serviceevent],
        'name':
        'display'
    })
Ejemplo n.º 11
0
    def get_context(self):

        context = super().get_context()

        # since we're grouping by site, we need to handle sites separately
        form = self.get_filter_form()
        reviewed = form.cleaned_data.get("review_status")
        qs = self.filter_set.qs
        if reviewed == "unreviewed":
            qs = qs.filter(faultreviewinstance=None)
        elif reviewed == "reviewed":
            qs = qs.exclude(faultreviewinstance=None)

        sites = qs.order_by("unit__site__name", ).values_list(
            "unit__site",
            flat=True,
        ).distinct()

        sites_data = []

        for site in sites:

            if site:  # site can be None here since not all units may have a site
                site = umodels.Site.objects.get(pk=site)

            sites_data.append((site.name if site else "", []))

            for fault in self.get_faults_for_site(qs, site):
                sites_data[-1][-1].append({
                    'id':
                    fault.id,
                    'fault_type':
                    format_fault_types(fault),
                    'unit_name':
                    fault.unit.name,
                    'modality':
                    fault.modality.name
                    if fault.modality else _("Not specified"),
                    'occurred':
                    format_datetime(fault.occurred),
                    'link':
                    self.make_url(fault.get_absolute_url(), plain=True),
                })

        context['sites_data'] = sites_data

        return context
Ejemplo n.º 12
0
    def test_edit_with_changed_reviews(self):
        """Test that editing a fault with existing reviewer works"""

        FaultType.objects.create(code="fault type")

        fault = utils.create_fault(user=self.user)
        rev_group = utils.create_fault_review_group()
        utils.create_fault_review(fault=fault,
                                  review_group=rev_group,
                                  reviewed_by=self.user)
        self.user.groups.add(rev_group.group)
        new_u = qa_utils.create_user()
        new_u.groups.add(rev_group.group)

        modality = u_models.Modality.objects.create(name="modality")
        fault.unit.modalities.add(modality)

        edit_url = reverse("fault_edit", kwargs={'pk': fault.pk})
        se = sl_utils.create_service_event()
        fault.related_service_events.add(se)

        data = {
            "fault-occurred": format_datetime(fault.occurred),
            "fault-unit": fault.unit.id,
            "fault-modality": modality.pk,
            "fault-fault_types_field": [fault.fault_types.first().code],
            "fault-comment": "",
            "fault-related_service_events": [se.pk],
            "review-form-0-group": rev_group.group.name,
            "review-form-0-reviewed_by": new_u.pk,
        }

        assert list(
            fault.faultreviewinstance_set.values_list(
                "reviewed_by_id", flat=True)) == [self.user.pk]
        resp = self.client.post(edit_url, data)
        assert resp.status_code == 302
        fault.refresh_from_db()
        assert fault.faultreviewinstance_set.count() == 1
        assert list(
            fault.faultreviewinstance_set.values_list(
                "reviewed_by_id", flat=True)) == [new_u.pk]
Ejemplo n.º 13
0
    def test_formset_required_fields(self):

        data = {
            'datetime_service': format_datetime(timezone.now()),
            'unit_field': self.u_1.id,
            'service_area_field': self.sa_1.id,
            'service_type': self.st.id,
            'problem_description': 'problem',
            'service_status': self.default_ses.id,
            'hours-INITIAL_FORMS': 0,
            'hours-MAX_NUM_FORMS': 1000,
            'hours-TOTAL_FORMS': 1,
            'hours-MIN_NUM_FORMS': 0,
            'parts-INITIAL_FORMS': 0,
            'parts-MAX_NUM_FORMS': 1000,
            'parts-TOTAL_FORMS': 1,
            'parts-MIN_NUM_FORMS': 0,
            'rtsqa-INITIAL_FORMS': 0,
            'rtsqa-MAX_NUM_FORMS': 1000,
            'rtsqa-TOTAL_FORMS': 0,
            'rtsqa-MIN_NUM_FORMS': 0,
            'parts-0-part': self.part.id,
            'hours-0-user_or_thirdparty': 'user-%s' % self.user.id
        }

        response = self.client.post(self.url, data=data)
        self.assertTrue(
            'quantity' in response.context_data['part_used_formset'].errors[0])
        self.assertTrue(
            'time' in response.context_data['hours_formset'].errors[0])

        data['parts-0-part'] = ''
        data['parts-0-quantity'] = 1
        data['hours-0-user_or_thirdparty'] = ''
        data['hours-0-time'] = '0030'

        response = self.client.post(self.url, data=data)
        self.assertTrue(
            'part' in response.context_data['part_used_formset'].errors[0])
        self.assertTrue('user_or_thirdparty' in
                        response.context_data['hours_formset'].errors[0])
Ejemplo n.º 14
0
def item_val_to_string(item):
    if item is None:
        return ''
    elif isinstance(item, str):
        return item
    elif isinstance(item, User):
        return get_user_name(item)
    elif isinstance(item, timezone.datetime):
        return format_datetime(item)
    elif isinstance(item, timezone.timedelta):
        total_seconds = int(item.total_seconds())
        hours = total_seconds // 3600
        minutes = (total_seconds % 3600) // 60
        return '{}:{:02}'.format(hours, minutes)
    elif isinstance(item, (
            QuerySet,
            list,
            tuple,
    )):
        return ', '.join([str(i) for i in item])
    else:
        return str(item)
Ejemplo n.º 15
0
def test_list_instance_report(request, pk):

    tli = get_object_or_404(models.TestListInstance, id=pk)
    utc = tli.unit_test_collection
    wc = format_datetime(tli.work_completed)

    base_opts = {
        'report_type': TestListInstanceDetailsReport.report_type,
        'report_format': request.GET.get("type", "pdf"),
        'title': "%s - %s - %s" % (utc.unit.name, tli.test_list.name, wc),
        'include_signature': False,
        'visible_to': [],
    }

    report_opts = {
        'work_completed': "%s - %s" % (wc, wc),
        'unit_test_collection': [utc.id],
    }
    report = TestListInstanceDetailsReport(base_opts=base_opts,
                                           report_opts=report_opts,
                                           user=request.user)

    return report.render_to_response(base_opts['report_format'])
Ejemplo n.º 16
0
    def test_valid_edit_remove_attach(self):
        """Test that editing a fault and modifying a field works"""

        FaultType.objects.create(code="fault type")

        fault = utils.create_fault()
        test_file = SimpleUploadedFile("TESTRUNNER_test_file.json", b"{}")
        attach = Attachment.objects.create(fault=fault,
                                           attachment=test_file,
                                           created_by=self.user)
        assert fault.attachment_set.count() == 1
        ft2 = utils.create_fault_type()
        assert fault.modality is None

        modality = u_models.Modality.objects.create(name="modality")
        fault.unit.modalities.add(modality)

        edit_url = reverse("fault_edit", kwargs={'pk': fault.pk})
        se = sl_utils.create_service_event()
        fault.related_service_events.add(se)

        data = {
            "fault-occurred": format_datetime(fault.occurred),
            "fault-unit": fault.unit.id,
            "fault-modality": modality.pk,
            "fault-fault_types_field":
            [fault.fault_types.first().code, ft2.code],
            "fault-comment": "",
            "fault-related_service_events": [se.pk],
            "fault-attachments_delete_ids": [attach.id, ''],
        }

        resp = self.client.post(edit_url, data)
        assert resp.status_code == 302
        fault.refresh_from_db()
        assert fault.attachment_set.count() == 0
Ejemplo n.º 17
0
    def get_context(self):

        context = super().get_context()

        # since we're grouping by site, we need to handle sites separately
        sites = self.filter_set.qs.order_by(
            "unit_service_area__unit__site__name", ).values_list(
                "unit_service_area__unit__site",
                flat=True,
            ).distinct()

        sites_data = []

        for site in sites:

            if site:  # site can be None here since not all units may have a site
                site = umodels.Site.objects.get(pk=site)

            sites_data.append((site.name if site else "", []))

            for se in self.get_ses_for_site(self.filter_set.qs, site):
                initiated_by_link = (self.make_url(
                    se.test_list_instance_initiated_by.get_absolute_url(),
                    plain=True) if se.test_list_instance_initiated_by else
                                     None)

                related_ses = []
                for se_rel in se.service_event_related.all():
                    related_ses.append(
                        (se_rel.id, se_rel.datetime_service,
                         self.make_url(se_rel.get_absolute_url(), plain=True)))

                group_linkers = defaultdict(list)
                for gli in se.grouplinkerinstance_set.all():
                    group_linkers[gli.group_linker.name].append(
                        gli.user.username)

                hours = []
                for h in se.hours_set.all():
                    u = h.user.username if h.user else "%s (%s)" % (str(
                        h.third_party), h.third_party.vendor.name)
                    hours.append((u, h.time))

                rts_qc = []
                for rts in se.returntoserviceqa_set.all():
                    tli = rts.test_list_instance
                    wc = format_datetime(tli.work_completed) if tli else ""
                    link = self.make_url(tli.get_absolute_url(),
                                         plain=True) if tli else ""
                    rts_qc.append((rts.unit_test_collection.name, wc, link))

                rts_comments = []
                comment_qs = Comment.objects.for_model(se).values_list(
                    "user__username",
                    "submit_date",
                    "comment",
                )
                for user, dt, comment in comment_qs:
                    rts_comments.append((user, format_datetime(dt), comment))

                parts = []
                for part_used in se.partused_set.all():
                    parts.append(
                        (part_used.part.name, str(part_used.from_storage
                                                  or ""), part_used.quantity))

                attachments = []
                for a in se.attachment_set.all():
                    attachments.append(
                        (a.label, self.make_url(a.attachment.url, plain=True)))

                sites_data[-1][-1].append({
                    'id':
                    se.id,
                    'service_date':
                    format_as_date(se.datetime_service),
                    'site':
                    site.name if site else "",
                    'unit_name':
                    se.unit_service_area.unit.name,
                    'service_area':
                    se.unit_service_area.service_area.name,
                    'service_type':
                    se.service_type.name,
                    'service_time':
                    se.duration_service_time,
                    'lost_time':
                    se.duration_lost_time,
                    'status':
                    se.service_status.name,
                    'created_by':
                    format_user(se.user_created_by),
                    'created_date':
                    format_datetime(se.datetime_created),
                    'modified_by':
                    format_user(se.user_modified_by),
                    'modified_date':
                    format_datetime(se.datetime_modified),
                    'problem':
                    se.problem_description,
                    'work':
                    se.work_description,
                    'safety':
                    se.safety_precautions,
                    'initiated_by':
                    se.test_list_instance_initiated_by,
                    'initiated_by_link':
                    initiated_by_link,
                    'related_ses':
                    related_ses,
                    'group_linkers':
                    sorted(group_linkers.items()),
                    'hours':
                    hours,
                    'rts_qc':
                    rts_qc,
                    'rts_comments':
                    rts_comments,
                    'parts':
                    parts,
                    'attachments':
                    attachments,
                    'link':
                    self.make_url(se.get_absolute_url(), plain=True),
                })

        context['sites_data'] = sites_data

        return context
Ejemplo n.º 18
0
    def get_context(self):

        context = super().get_context()

        # since we're grouping by site, we need to handle sites separately
        form = self.get_filter_form()
        reviewed = form.cleaned_data.get("review_status")
        qs = self.filter_set.qs
        if reviewed == "unreviewed":
            qs = qs.filter(faultreviewinstance=None)
        elif reviewed == "reviewed":
            qs = qs.exclude(faultreviewinstance=None)

        sites = qs.order_by("unit__site__name", ).values_list(
            "unit__site",
            flat=True,
        ).distinct()

        sites_data = []

        for site in sites:

            if site:  # site can be None here since not all units may have a site
                site = umodels.Site.objects.get(pk=site)

            sites_data.append((site.name if site else "", []))

            for fault in self.get_faults_for_site(qs, site):
                related_ses = []
                for se_rel in fault.related_service_events.all():
                    related_ses.append(
                        (se_rel.id, se_rel.datetime_service,
                         self.make_url(se_rel.get_absolute_url(), plain=True)))

                comments = []
                comment_qs = Comment.objects.for_model(fault).values_list(
                    "user__username",
                    "submit_date",
                    "comment",
                )
                for user, dt, comment in comment_qs:
                    comments.append((user, format_datetime(dt), comment))

                sites_data[-1][-1].append({
                    'id':
                    fault.id,
                    'occurred':
                    format_datetime(fault.occurred),
                    'site':
                    site.name if site else "",
                    'unit_name':
                    fault.unit.name,
                    'fault_type':
                    format_fault_types(fault),
                    'modality':
                    fault.modality.name
                    if fault.modality else _("Not specified"),
                    'created_by':
                    format_user(fault.created_by),
                    'created':
                    format_datetime(fault.created),
                    'modified_by':
                    format_user(fault.modified_by),
                    'modified':
                    format_datetime(fault.modified),
                    'reviewed_by':
                    format_review_users(fault),
                    'reviewed':
                    format_review_dates(fault),
                    'related_ses':
                    related_ses,
                    'comments':
                    comments,
                    'link':
                    self.make_url(fault.get_absolute_url(), plain=True),
                })

        context['sites_data'] = sites_data

        return context
Ejemplo n.º 19
0
def format_review_dates(fault):
    return ', '.join(
        format_datetime(fri.reviewed)
        for fri in fault.faultreviewinstance_set.all())
Ejemplo n.º 20
0
    def to_table(self, context):

        rows = [
            [_("Report Title:"), context['report_title']],
            [_("View On Site:"), self.get_report_url()],
            [_("Report Type:"), context['report_name']],
            [_("Report Description:"), context['report_description']],
            [_("Generated:"), format_datetime(timezone.now())],
            [],
            ["Filters:"],
        ]

        for label, criteria in context['report_details']:
            rows.append([label + ":", criteria])

        for tli in context['queryset']:

            rows.extend([
                [],
                [],
                ["Test List Instance:",
                 self.make_url(tli.get_absolute_url())],
                [_("Created By") + ":",
                 format_user(tli.created_by)],
                [_("Work Started") + ":",
                 format_as_date(tli.work_started)],
                [
                    _("Work Completed") + ":",
                    format_as_date(tli.work_completed)
                ],
                [
                    _("Duration") + ":",
                    _("In Progress")
                    if tli.in_progress else as_time_delta(tli.duration())
                ],
                [_("Modified") + ":",
                 format_as_date(tli.modified)],
                [_("Mofified By") + ":",
                 format_user(tli.modified_by)],
            ])
            if tli.all_reviewed and not tli.reviewed_by:
                rows.extend([
                    [_("Reviewed") + ":",
                     format_as_date(tli.modified)],
                    [_("Reviewed By") + ":",
                     _("Auto Reviewed")],
                ])
            else:
                rows.extend([
                    [_("Reviewed") + ":",
                     format_as_date(tli.reviewed)],
                    [_("Reviewed By") + ":",
                     format_user(tli.reviewed_by)],
                ])

            for c in context['comments'].get(tli.pk, []):
                rows.append(
                    [_("Comment") + ":",
                     format_datetime(c[0]), c[1], c[2]])

            for a in tli.attachment_set.all():
                rows.append([
                    _("Attachment") + ":", a.label,
                    self.make_url(a.attachment.url, plain=True)
                ])

            rows.append([])
            rows.append([
                _("Test"),
                _("Value"),
                _("Reference"),
                _("Tolerance"),
                _("Pass/Fail"),
                _("Review Status"),
                _("Comment"),
                _("Attachments"),
            ])

            for ti, history in tli.history()[0]:
                row = [
                    ti.unit_test_info.test.name,
                    ti.value_display(coerce_numerical=False),
                    ti.reference.value_display() if ti.reference else "",
                    ti.tolerance.name if ti.tolerance else "",
                    ti.get_pass_fail_display(),
                    ti.status.name,
                    ti.comment,
                ]
                for a in ti.attachment_set.all():
                    row.append(self.make_url(a.attachment.url, plain=True))

                rows.append(row)

        return rows
Ejemplo n.º 21
0
    def test_submit_valid(self):

        st = sl_utils.create_service_type()

        user = User.objects.filter(groups=self.gl_1.group).first()
        user.user_permissions.add(
            Permission.objects.get(codename='can_have_hours'))

        data = {
            'datetime_service':
            format_datetime(timezone.now()),
            'unit_field':
            self.u_1.id,
            'unit_field_fake':
            self.u_1.id,
            'service_area_field':
            self.usa_1.service_area.id,
            'service_type':
            st.id,
            'problem_description':
            'uhhhhh ohhhh',
            'work_description':
            'stuff was done',
            'safety_precautions':
            'we were careful',
            'qafollowup_notes':
            'comment',
            'service_event_related_field':
            [sl_utils.create_service_event(unit_service_area=self.usa_1).id],
            'service_status':
            models.ServiceEventStatus.get_default().id,
            'test_list_instance_initiated_by':
            self.tli_1_1.id,
            'duration_service_time':
            '4321',
            'duration_lost_time':
            '1234',
            'initiated_utc_field':
            self.tli_1_1.unit_test_collection.id,
            'group_linker_1':
            user.id,
            'hours-INITIAL_FORMS':
            0,
            'hours-MAX_NUM_FORMS':
            1000,
            'hours-TOTAL_FORMS':
            1,
            'hours-MIN_NUM_FORMS':
            0,
            'parts-INITIAL_FORMS':
            0,
            'parts-MAX_NUM_FORMS':
            1000,
            'parts-TOTAL_FORMS':
            1,
            'parts-MIN_NUM_FORMS':
            0,
            'rtsqa-INITIAL_FORMS':
            0,
            'rtsqa-MAX_NUM_FORMS':
            1000,
            'rtsqa-TOTAL_FORMS':
            1,
            'rtsqa-MIN_NUM_FORMS':
            0,
            'hours-0-time':
            '100',
            'hours-0-user_or_thirdparty':
            'user-%s' % user.id,
            'rtsqa-0-all_reviewed':
            self.tli_1_2.all_reviewed,
            'rtsqa-0-unit_test_collection':
            self.tli_1_2.unit_test_collection.id,
            'rtsqa-0-test_list_instance':
            self.tli_1_2.id,
            'parts-0-quantity':
            1,
            'parts-0-part':
            self.part.id,
            'parts-0-from_storage':
            self.part.storage.all().first().id
        }

        se_count = models.ServiceEvent.objects.count()
        response = self.client.post(self.url, data=data)

        se_id = models.ServiceEvent.objects.filter(
            problem_description='uhhhhh ohhhh').first().id

        self.assertEqual(se_count + 1, models.ServiceEvent.objects.count())
        self.assertEqual(
            1,
            p_models.PartUsed.objects.filter(service_event=se_id).count())
        self.assertEqual(
            1,
            models.ReturnToServiceQA.objects.filter(
                service_event=se_id).count())
        self.assertEqual(
            1,
            models.Hours.objects.filter(service_event=se_id).count())

        self.assertEqual(response.status_code, 302)
Ejemplo n.º 22
0
def render_log(service_log, user, link=True, show_rtsqa=False):
    today = timezone.now().date()
    if service_log.datetime.date() == today:
        if timezone.now() - service_log.datetime < timezone.timedelta(hours=1):
            datetime_display = '%s %s' % (
                int((timezone.now() - service_log.datetime).total_seconds() / 60), _('minutes ago')
            )
        else:
            datetime_display = format_as_time(service_log.datetime)
    elif service_log.datetime.date() == today - timezone.timedelta(days=1):
        datetime_display = '%s %s' % (_('Yesterday'), format_as_time(service_log.datetime))
    else:
        datetime_display = format_datetime(service_log.datetime)

    context = {
        'instance': service_log,
        'datetime_display': datetime_display,
        'user': get_user_name(service_log.user),
        'can_view': user.has_perm('service_log.view_serviceevent') and service_log.service_event.is_active and link,
        'show_rtsqa': show_rtsqa
    }
    if service_log.log_type == sl_models.NEW_SERVICE_EVENT:

        return get_template('service_log/log_service_event_new.html').render(context)

    elif service_log.log_type == sl_models.MODIFIED_SERVICE_EVENT:

        try:
            extra_info = json.loads(service_log.extra_info.replace("'", '"'))
        except:  # noqa: E722
            extra_info = service_log.extra_info

        context['extra_info'] = extra_info
        return get_template('service_log/log_service_event_modified.html').render(context)

    elif service_log.log_type == sl_models.STATUS_SERVICE_EVENT:

        try:
            extra_info = json.loads(service_log.extra_info.replace("'", '"'))
        except:  # noqa: E722
            extra_info = service_log.extra_info

        context['extra_info'] = extra_info
        status_old_colour = cache.get(settings.CACHE_SERVICE_STATUS_COLOURS).get(extra_info['status_change']['old'])
        context['old_status_tag'] = '<span class="label smooth-border" style="border-color: %s;">%s</span>' % (
            status_old_colour, extra_info['status_change']['old']
        ) if status_old_colour is not None else extra_info['status_change']['old']

        status_new_colour = cache.get(settings.CACHE_SERVICE_STATUS_COLOURS).get(extra_info['status_change']['new'])
        context['new_status_tag'] = '<span class="label smooth-border" style="border-color: %s;">%s</span>' % (
            status_new_colour, extra_info['status_change']['new']
        ) if status_new_colour is not None else extra_info['status_change']['new']
        context['new_status_colour'] = status_new_colour

        return get_template('service_log/log_service_event_status.html').render(context)

    elif service_log.log_type == sl_models.CHANGED_RTSQA:

        try:
            extra_info = json.loads(service_log.extra_info.replace("'", '"'))
        except:  # noqa: E722
            extra_info = service_log.extra_info

        context['extra_info'] = extra_info
        return get_template('service_log/log_rtsqa.html').render(context)

    elif service_log.log_type == sl_models.DELETED_SERVICE_EVENT:

        try:
            extra_info = json.loads(service_log.extra_info.replace("'", '"'))
        except:  # noqa: E722
            extra_info = service_log.extra_info

        context['extra_info'] = extra_info
        return get_template('service_log/log_service_event_deleted.html').render(context)
Ejemplo n.º 23
0
    def setUp(self):

        self.factory = RequestFactory()
        self.view = views.UpdateServiceEvent.as_view()

        self.default_ses = sl_utils.create_service_event_status(
            is_default=True)
        self.approved_ses = sl_utils.create_service_event_status(
            is_review_required=False, rts_qa_must_be_reviewed=True)
        sl_utils.create_service_event_status()
        qa_utils.create_status(is_default=True)

        now = timezone.now()

        self.u_1 = qa_utils.create_unit(name='u_1')
        self.sa_1 = sl_utils.create_service_area(name='sa_1')
        self.usa_1 = sl_utils.create_unit_service_area(unit=self.u_1,
                                                       service_area=self.sa_1)
        self.tl_1 = qa_utils.create_test_list(name='tl_1')
        self.tli_1_1 = qa_utils.create_test_list_instance(
            unit_test_collection=qa_utils.create_unit_test_collection(
                unit=self.u_1, test_collection=self.tl_1),
            test_list=self.tl_1,
            work_completed=now - timezone.timedelta(hours=1))
        self.tli_1_2 = qa_utils.create_test_list_instance(
            unit_test_collection=qa_utils.create_unit_test_collection(
                unit=self.u_1, test_collection=self.tl_1),
            test_list=self.tl_1,
            work_completed=now)
        self.se_1 = sl_utils.create_service_event(unit_service_area=self.usa_1)

        self.u_2 = qa_utils.create_unit(name='u_2')
        self.sa_2 = sl_utils.create_service_area(name='sa_2')
        self.usa_2 = sl_utils.create_unit_service_area(unit=self.u_2,
                                                       service_area=self.sa_2)
        self.tl_2 = qa_utils.create_test_list(name='tl_2')
        self.tli_2_1 = qa_utils.create_test_list_instance(
            unit_test_collection=qa_utils.create_unit_test_collection(
                unit=self.u_2, test_collection=self.tl_2),
            test_list=self.tl_2,
            work_completed=now - timezone.timedelta(hours=1))
        self.tli_2_2 = qa_utils.create_test_list_instance(
            unit_test_collection=qa_utils.create_unit_test_collection(
                unit=self.u_2, test_collection=self.tl_2),
            test_list=self.tl_2,
            work_completed=now)
        self.se_2 = sl_utils.create_service_event(unit_service_area=self.usa_2)

        self.url = reverse('sl_new')
        self.user = create_user(is_superuser=True)

        self.client.login(username='******', password='******')

        perm = Permission.objects.get(codename='can_have_hours')
        user_can_hours = User.objects.get(username='******')
        user_can_hours.user_permissions.add(perm)
        user_group_has_hours = create_user(uname='in_group_with_hours')
        group_has_hours = create_group(name='can_have_hours')
        group_has_hours.permissions.add(perm)
        user_group_has_hours.groups.add(group_has_hours)

        sl_utils.create_third_party()

        group_linked = create_group(name='linked')
        user_group_linked = create_user(uname='user_in_group_linked')
        user_group_linked.groups.add(group_linked)
        self.gl_1 = sl_utils.create_group_linker(group=group_linked)
        self.part = sl_utils.create_part(add_storage=True)

        self.st = sl_utils.create_service_type()

        self.se = sl_utils.create_service_event(
            unit_service_area=self.usa_1,
            service_status=self.default_ses,
            service_type=self.st)

        self.url = reverse('sl_edit', kwargs={"pk": self.se.pk})

        self.data = {
            'datetime_service': format_datetime(timezone.now()),
            'service_status': self.default_ses.id,
            'service_type': self.st.id,
            'is_review_required': 0,
            'safety_precautions': 'safety_precautions',
            'problem_description': 'problem_description',
            'service_area_field': self.se.unit_service_area.service_area.id,
            'unit_field': self.se.unit_service_area.unit.id,
            'unit_field_fake': self.se.unit_service_area.unit.id,
            'qafollowup_notes': 'qafollowup_notes',
            'test_list_instance_initiated_by': self.tli_1_1.id,
            'duration_lost_time': '0100',
            'duration_service_time': '0100',
            'hours-INITIAL_FORMS': 0,
            'hours-MAX_NUM_FORMS': 1000,
            'hours-TOTAL_FORMS': 0,
            'hours-MIN_NUM_FORMS': 0,
            'parts-INITIAL_FORMS': 0,
            'parts-MAX_NUM_FORMS': 1000,
            'parts-TOTAL_FORMS': 0,
            'parts-MIN_NUM_FORMS': 0,
            'rtsqa-INITIAL_FORMS': 0,
            'rtsqa-MAX_NUM_FORMS': 1000,
            'rtsqa-TOTAL_FORMS': 0,
            'rtsqa-MIN_NUM_FORMS': 0,
        }