Princeton-CDH / mep-django

Compare 56db68a ... +5 ... 9ea7920

Coverage Reach
mep/people/tests/test_views.py mep/people/tests/test_models.py mep/people/tests/test_people_signals.py mep/people/tests/test_admin.py mep/people/tests/test_forms.py mep/people/tests/test_geonames.py mep/people/tests/test_sitemaps.py mep/people/tests/test_people_commands.py mep/people/tests/test_people_migrations.py mep/people/views.py mep/people/models.py mep/people/migrations/0016_generate_person_slugs.py mep/people/migrations/0005_people_address_to_account_address.py mep/people/migrations/0007_location_unique_constraints.py mep/people/migrations/0004_rename_address_to_location.py mep/people/migrations/0003_infer_sex_from_title.py mep/people/migrations/0014_library_location.py mep/people/migrations/0001_initial.py mep/people/migrations/0019_pastpersonslug.py mep/people/migrations/0013_rename_sex_to_gender.py mep/people/migrations/0015_add_person_optional_slug.py mep/people/migrations/0002_add_subtype_choices.py mep/people/migrations/0018_on_delete.py mep/people/migrations/0009_allow_negative_years.py mep/people/migrations/0010_merge_20180621_1810.py mep/people/migrations/0006_update_person_locations.py mep/people/migrations/0008_person_is_organization.py mep/people/migrations/0017_person_require_unique_slugs.py mep/people/migrations/0009_person_updated_at.py mep/people/migrations/0011_person_verified.py mep/people/migrations/0012_add_public_notes.py mep/people/admin.py mep/people/management/commands/export_members.py mep/people/geonames.py mep/people/sitemaps.py mep/people/forms.py mep/people/queryset.py mep/people/apps.py mep/people/urls.py mep/people/__init__.py mep/accounts/tests/test_accounts_models.py mep/accounts/tests/test_accounts_commands.py mep/accounts/tests/test_twitterbot_100years.py mep/accounts/tests/test_partial_date.py mep/accounts/tests/test_accounts_migrations.py mep/accounts/tests/test_accounts_admin.py mep/accounts/tests/test_accounts_views.py mep/accounts/tests/test_account_templatetags.py mep/accounts/management/commands/twitterbot_100years.py mep/accounts/management/commands/import_figgy_cards.py mep/accounts/management/commands/report_timegaps.py mep/accounts/management/commands/export_events.py mep/accounts/migrations/0025_subevent_item_to_generic.py mep/accounts/migrations/0028_generic_event_partial_dates.py mep/accounts/migrations/0008_flag_duplicate_events.py mep/accounts/migrations/0033_subscription_purchase_date_adjustments.py mep/accounts/migrations/0004_subtype_choices_to_subscription_type_foreignkey.py mep/accounts/migrations/0015_fix_subscription_durations.py mep/accounts/migrations/0012_recalculate_durations.py mep/accounts/migrations/0010_set_reimbursement_end_date_from_start.py mep/accounts/migrations/0001_initial.py mep/accounts/migrations/0022_add_partial_date_purchase.py mep/accounts/migrations/0019_allow_null_precision.py mep/accounts/migrations/0015_borrow_event_rel_item.py mep/accounts/migrations/0021_account_card.py mep/accounts/migrations/0027_address_partial_dates.py mep/accounts/migrations/0029_event_item_to_work.py mep/accounts/migrations/0014_add_address_rel_to_person.py mep/accounts/migrations/0030_event_edition.py mep/accounts/migrations/0003_new_subscription_type_model_foreignkey.py mep/accounts/migrations/0024_event_generic_item.py mep/accounts/migrations/0016_add_borrow_date_precision.py mep/accounts/migrations/0002_field_adjustments_logbook_import.py mep/accounts/migrations/0009_event_ordering_reimbursement_price_to_refund.py mep/accounts/migrations/0011_subscription_duration_to_days.py mep/accounts/migrations/0006_rename_subscribe_and_modification.py mep/accounts/migrations/0032_subscription_add_purchase_date.py mep/accounts/migrations/0018_merge_20180418_1607.py mep/accounts/migrations/0023_optional_price.py mep/accounts/migrations/0007_currency_default_to_franc.py mep/accounts/migrations/0026_rm_subevent_item_rename_generic_item.py mep/accounts/migrations/0017_revise_purchase_from_borrow.py mep/accounts/migrations/0020_convert_bought_to_item_status.py mep/accounts/migrations/0005_remove_subscribe_sub_type.py mep/accounts/migrations/0013_rename_accountaddress_to_address.py mep/accounts/migrations/0031_on_delete.py mep/accounts/models.py mep/accounts/admin.py mep/accounts/partial_date.py mep/accounts/event_set.py mep/accounts/views.py mep/accounts/templatetags/account_tags.py mep/accounts/templatetags/mep_100years_tags.py mep/accounts/apps.py mep/accounts/urls.py mep/accounts/__init__.py mep/books/tests/test_books_models.py mep/books/tests/test_books_views.py mep/books/tests/test_books_commands.py mep/books/tests/test_oclc.py mep/books/tests/test_books_migrations.py mep/books/tests/test_books_admin.py mep/books/tests/test_books_signals.py mep/books/tests/test_books_utils.py mep/books/tests/test_books_forms.py mep/books/tests/test_books_queryset.py mep/books/models.py mep/books/migrations/0022_generate_work_slugs.py mep/books/migrations/0018_edition_date_to_partial.py mep/books/migrations/0021_creator_type_order.py mep/books/migrations/0016_group_works_by_uri.py mep/books/migrations/0025_populate_sort_title.py mep/books/migrations/0010_add_initial_formats.py mep/books/migrations/0003_initial_creator_types.py mep/books/migrations/0001_initial.py mep/books/migrations/0002_refactor_item_creators.py mep/books/migrations/0015_split_work_edition.py mep/books/migrations/0017_edition_details.py mep/books/migrations/0009_item_format.py mep/books/migrations/0011_item_multiple_genres.py mep/books/migrations/0014_item_to_work.py mep/books/migrations/0008_add_oclc_item_fields.py mep/books/migrations/0013_item_ebook_url.py mep/books/migrations/0019_edition_remove_year.py mep/books/migrations/0007_item_updated_at.py mep/books/migrations/0006_item_creators.py mep/books/migrations/0020_format_on_delete.py mep/books/migrations/0005_item_mepid_allow_null.py mep/books/migrations/0004_viaf_to_uri.py mep/books/migrations/0026_add_past_work_slug.py mep/books/migrations/0012_add_public_notes.py mep/books/migrations/0023_merge_20200406_1206.py mep/books/migrations/0024_add_work_sort_title.py mep/books/migrations/0021_work_slug_creator_order.py mep/books/views.py mep/books/management/commands/reconcile_oclc.py mep/books/management/commands/export_books.py mep/books/admin.py mep/books/oclc.py mep/books/migration_group_work_utils.py mep/books/utils.py mep/books/forms.py mep/books/sitemaps.py mep/books/queryset.py mep/books/apps.py mep/books/urls.py mep/books/__init__.py mep/common/tests.py mep/common/migrations/0002_update_content_editor_perms_subscriptiontype.py mep/common/migrations/0006_update_content_editor_perms_works_and_djiffy.py mep/common/migrations/0001_content_editor_group.py mep/common/migrations/0007_add_data_viewer_group.py mep/common/migrations/0004_update_content_editor_perms_creatortype.py mep/common/migrations/0003_content_editor_perms_location.py mep/common/migrations/0005_create_script_user.py mep/common/templatetags/mep_tags.py mep/common/views.py mep/common/forms.py mep/common/models.py mep/common/management/export.py mep/common/utils.py mep/common/admin.py mep/common/solr.py mep/common/apps.py mep/common/validators.py mep/common/__init__.py mep/footnotes/tests/test_footnotes_signals.py mep/footnotes/tests/test_footnote_models.py mep/footnotes/tests/test_footnote_views.py mep/footnotes/models.py mep/footnotes/views.py mep/footnotes/admin.py mep/footnotes/migrations/0005_consolidate_event_footnotes.py mep/footnotes/migrations/0001_initial.py mep/footnotes/migrations/0003_add_bibliography_manifest_and_footnote_canvas.py mep/footnotes/migrations/0004_on_delete.py mep/footnotes/migrations/0002_footnote_is_agree_default_true.py mep/footnotes/forms.py mep/footnotes/queryset.py mep/footnotes/urls.py mep/footnotes/apps.py mep/footnotes/__init__.py mep/pages/tests/test_pages_models.py mep/pages/tests/test_pages_commands.py mep/pages/tests/test_pages_templates.py mep/pages/tests/test_tags.py mep/pages/models.py mep/pages/migrations/0010_split_person_names.py mep/pages/migrations/0007_essay_landingpage_and_creators.py mep/pages/migrations/0001_initial.py mep/pages/migrations/0003_contentpage_add_featured_image_description.py mep/pages/migrations/0006_add_svg_image_block.py mep/pages/migrations/0009_svg_extended_description.py mep/pages/migrations/0004_landingpage_optional_body.py mep/pages/migrations/0008_linkable_section_anchor_text.py mep/pages/migrations/0003_image_alt_text.py mep/pages/migrations/0002_homepage_streamfield.py mep/pages/migrations/0011_updated_streamfield_blocks.py mep/pages/migrations/0005_merge_20191010_1625.py mep/pages/management/commands/setup_site_pages.py mep/pages/wagtail_hooks.py mep/pages/admin.py mep/pages/templatetags/mep_page_tags.py mep/pages/apps.py mep/pages/__init__.py mep/settings.py mep/urls.py mep/dashboard.py mep/__init__.py mep/wsgi.py mep/context_processors.py srcmedia/ts/lib/common.ts srcmedia/ts/lib/form.ts srcmedia/ts/lib/facet.ts srcmedia/ts/lib/input.ts srcmedia/ts/lib/select.ts srcmedia/ts/lib/filter.ts srcmedia/ts/lib/sort.ts srcmedia/ts/lib/output.ts srcmedia/ts/components/ActiveFilters.ts srcmedia/ts/components/PageControls.ts srcmedia/ts/components/StickyControls.ts srcmedia/ts/components/MainMenu.ts

No flags found

Use flags to group coverage reports by test type, project and/or folders.
Then setup custom commit statuses and notifications for each flag.

e.g., #unittest #integration

#production #enterprise

#frontend #backend

Learn more about Codecov Flags here.


@@ -26,7 +26,7 @@
Loading
26 26
    csv_fields = [
27 27
        'event_type',
28 28
        'start_date', 'end_date',
29 -
        'member_URIs', 'member_names', 'member_sort_names',
29 +
        'member_uris', 'member_names', 'member_sort_names',
30 30
        # subscription specific
31 31
        'subscription_price_paid', 'subscription_deposit',
32 32
        'subscription_duration', 'subscription_duration_days',
@@ -38,6 +38,8 @@
Loading
38 38
        'borrow_status',
39 39
        # purchase specific
40 40
        'purchase_price',
41 +
        # currency applies to purchase, borrow, and subscription
42 +
        'currency',
41 43
        # related book/item
42 44
        'item_uri', 'item_title', 'item_volume', 'item_authors',
43 45
        'item_year', 'item_notes',
@@ -70,18 +72,19 @@
Loading
70 72
71 73
        # variable to store footnote reference, if any
72 74
        footnote = None
75 +
        currency = None
73 76
74 77
        # subscription-specific data
75 78
        if event_type in ['Subscription', 'Supplement', 'Renewal']:
76 79
            data['subscription'] = self.subscription_info(obj)
80 +
            currency = obj.subscription.currency
77 81
78 82
        # reimbursement data
79 83
        elif event_type in 'Reimbursement' and obj.reimbursement.refund:
80 84
            data['reimbursement'] = {
81 -
                'refund': '%s%.2f' %
82 -
                          (obj.reimbursement.currency_symbol(),
83 -
                           obj.reimbursement.refund)
85 +
                'refund': '%.2f' % obj.reimbursement.refund
84 86
            }
87 +
            currency = obj.reimbursement.currency
85 88
86 89
        # borrow data
87 90
        elif event_type == 'Borrow':
@@ -92,9 +95,12 @@
Loading
92 95
        # purchase data
93 96
        elif event_type == 'Purchase' and obj.purchase.price:
94 97
            data['purchase'] = {
95 -
                'price': '%s%.2f' %
96 -
                         (obj.purchase.currency_symbol(), obj.purchase.price)
98 +
                'price': '%.2f' % obj.purchase.price
97 99
            }
100 +
            currency = obj.purchase.currency
101 +
102 +
        if currency:
103 +
            data['currency'] = currency
98 104
99 105
        # footnote should always be attached to the base event
100 106
        footnote = obj.footnotes.first()
@@ -114,7 +120,7 @@
Loading
114 120
            return
115 121
116 122
        return OrderedDict([
117 -
            ('URIs', [absolutize_url(m.get_absolute_url()) for m in members]),
123 +
            ('uris', [absolutize_url(m.get_absolute_url()) for m in members]),
118 124
            ('names', [m.name for m in members]),
119 125
            ('sort_names', [m.sort_name for m in members])
120 126
        ])
@@ -127,12 +133,12 @@
Loading
127 133
        except ObjectDoesNotExist:
128 134
            return
129 135
130 -
        info = OrderedDict([
131 -
            ('price_paid', '%s%.2f' % (subs.currency_symbol(),
132 -
                                       subs.price_paid or 0)),
133 -
            ('deposit', '%s%.2f' % (subs.currency_symbol(),
134 -
                                    subs.deposit or 0))
135 -
        ])
136 +
        info = OrderedDict()
137 +
        if subs.price_paid:
138 +
            info['price_paid'] = '%.2f' % subs.price_paid
139 +
        if subs.deposit:
140 +
            info['deposit'] = '%.2f' % subs.deposit
141 +
136 142
        if subs.duration:
137 143
            info['duration'] = subs.readable_duration()
138 144
            info['duration_days'] = subs.duration

@@ -419,7 +419,7 @@
Loading
419 419
        member_info = self.cmd.member_info(event)
420 420
        assert member_info['sort_names'][0] == person.sort_name
421 421
        assert member_info['names'][0] == person.name
422 -
        assert member_info['URIs'][0] == \
422 +
        assert member_info['uris'][0] == \
423 423
            absolutize_url(person.get_absolute_url())
424 424
425 425
        # event with two members; fixture includes Edel joint account
@@ -428,7 +428,7 @@
Loading
428 428
429 429
        member_info = self.cmd.member_info(event)
430 430
        # each field should have two values
431 -
        for field in ('sort_names', 'names', 'URIs'):
431 +
        for field in ('sort_names', 'names', 'uris'):
432 432
            assert len(member_info[field]) == 2
433 433
434 434
        # test event with account but no person
@@ -444,10 +444,9 @@
Loading
444 444
            .first()
445 445
        subs = event.subscription
446 446
        info = self.cmd.subscription_info(event)
447 -
        assert info['price_paid'] == '%s%.2f' % (subs.currency_symbol(),
448 -
                                                 subs.price_paid)
447 +
        assert info['price_paid'] == '%.2f' % subs.price_paid
449 448
        # test event has no deposit amount
450 -
        assert info['deposit'] == '%s0.00' % subs.currency_symbol()
449 +
        assert 'deposit' not in info
451 450
        assert info['duration'] == subs.readable_duration()
452 451
        assert info['duration_days'] == subs.duration
453 452
        assert info['volumes'] == subs.volumes
@@ -529,6 +528,19 @@
Loading
529 528
        assert info['manifest'] == footnote.bibliography.manifest.uri
530 529
        assert info['image'] == str(footnote.image.image)
531 530
531 +
    def test_get_object_data(self):
532 +
        # get a subscription with no subcategory and both dates
533 +
        event = Event.objects.filter(
534 +
            subscription__isnull=False,
535 +
            start_date__isnull=False, end_date__isnull=False,
536 +
            subscription__category__isnull=True) \
537 +
            .first()
538 +
        data = self.cmd.get_object_data(event)
539 +
        assert data['event_type'] == event.event_label
540 +
        assert data['currency'] == 'FRF'
541 +
        assert 'member' in data
542 +
        assert 'subscription' in data
543 +
532 544
    def test_command_line(self):
533 545
        # test calling via command line with args
534 546
        tempdir = TemporaryDirectory()

Everything is accounted for!

No changes detected that need to be reviewed.
What changes does Codecov check for?
Lines, not adjusted in diff, that have changed coverage data.
Files that introduced coverage data that had none before.
Files that have missing coverage data that once were tracked.
Files Coverage
mep +<.01% 98.44%
srcmedia/ts 86.55%
Project Totals (223 files) 98.00%
Loading