From 1832c8cabc518e7b6d6127e59900abf798f9f2f0 Mon Sep 17 00:00:00 2001 From: Iulian Masar Date: Fri, 30 May 2025 23:16:55 +0300 Subject: [PATCH 1/3] handle reports v2 --- mangopay/fields.py | 27 ++++++++++++++++++++- mangopay/resources.py | 26 +++++++++++++++++++- mangopay/utils.py | 27 +++++++++++++++++++++ tests/test_reports_v2.py | 51 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 tests/test_reports_v2.py diff --git a/mangopay/fields.py b/mangopay/fields.py index 2df96fc..5ef4acc 100644 --- a/mangopay/fields.py +++ b/mangopay/fields.py @@ -12,7 +12,8 @@ ScopeBlocked, BrowserInfo, Shipping, CurrentState, FallbackReason, InstantPayout, CountryAuthorizationData, \ PayinsLinked, ConversionRate, CardInfo, LocalAccountDetails, InternationalAccountDetails, \ VirtualAccountCapabilities, PaymentRef, PendingUserAction, LegalRepresentative, IndividualRecipient, \ - BusinessRecipient, RecipientPropertySchema, IndividualRecipientPropertySchema, BusinessRecipientPropertySchema + BusinessRecipient, RecipientPropertySchema, IndividualRecipientPropertySchema, BusinessRecipientPropertySchema, \ + ReportFilter class FieldDescriptor(object): @@ -1180,3 +1181,27 @@ def api_value(self, value): } return value + + +class ReportFilterField(Field): + def python_value(self, value): + if value is not None: + return ReportFilter(currency=value.get('Currency', None), user_id=value.get('UserId', None), + wallet_id=value.get('WalletId', None)) + + return value + + def api_value(self, value): + value = super(ReportFilterField, self).api_value(value) + + if isinstance(value, ReportFilter): + result = {} + if value.currency is not None: + result['Currency'] = value.currency + if value.user_id is not None: + result['UserId'] = value.user_id + if value.wallet_id is not None: + result['WalletId'] = value.wallet_id + return result + + return value diff --git a/mangopay/resources.py b/mangopay/resources.py index 8bc7dd5..13e27b9 100644 --- a/mangopay/resources.py +++ b/mangopay/resources.py @@ -18,7 +18,7 @@ LocalAccountDetailsField, VirtualAccountCapabilitiesField, PaymentRefField, PendingUserActionField, LegalRepresentativeField, IndividualRecipientField, BusinessRecipientField, RecipientPropertySchemaField, IndividualRecipientPropertySchemaField, - BusinessRecipientPropertySchemaField) + BusinessRecipientPropertySchemaField, ReportFilterField) from .query import InsertQuery, UpdateQuery, SelectQuery, ActionQuery, DeleteQuery @@ -2401,6 +2401,30 @@ class Meta: } +class ReportV2(BaseModel): + creation_date = DateTimeField(api_name='CreationDate') + report_date = DateTimeField(api_name='ReportDate') + status = CharField(api_name='Status') + result_code = CharField(api_name='ResultCode') + result_message = CharField(api_name='ResultMessage') + download_format = CharField(api_name='DownloadFormat', required=True) + download_url = CharField(api_name='DownloadURL') + report_type = CharField(api_name='ReportType', required=True) + sort = CharField(api_name='Sort') + after_date = DateTimeField(api_name='AfterDate', required=True) + before_date = DateTimeField(api_name='BeforeDate', required=True) + filters = ReportFilterField(api_name='Filters') + columns = ListField(api_name='Columns') + + class Meta: + verbose_name = 'reportv2' + verbose_name_plural = 'reportsv2' + url = { + InsertQuery.identifier: '/reporting/reports', + SelectQuery.identifier: '/reporting/reports/%(id)s' + } + + class BankingAlias(BaseModel): tag = CharField(api_name='Tag') credited_user = ForeignKeyField(User, api_name='CreditedUserId') diff --git a/mangopay/utils.py b/mangopay/utils.py index 46e3dc5..12149b1 100644 --- a/mangopay/utils.py +++ b/mangopay/utils.py @@ -1295,3 +1295,30 @@ def to_api_json(self): "BusinessName": self.business_name, "Address": self.address } + + +@add_camelcase_aliases +class ReportFilter(object): + def __init__(self, currency=None, user_id=None, wallet_id=None): + self.currency = currency + self.user_id = user_id + self.wallet_id = wallet_id + + def __str__(self): + return 'ReportFilter: %s , %s, %s' % \ + (self.currency, self.user_id, self.wallet_id) + + def __eq__(self, other): + if isinstance(other, ReportFilter): + stat = ((self.currency == other.currency) and + (self.user_id == other.user_id) and + (self.wallet_id == other.wallet_id)) + return stat + return False + + def to_api_json(self): + return { + "Currency": self.currency, + "UserId": self.user_id, + "WalletId": self.wallet_id + } diff --git a/tests/test_reports_v2.py b/tests/test_reports_v2.py new file mode 100644 index 0000000..8ff2106 --- /dev/null +++ b/tests/test_reports_v2.py @@ -0,0 +1,51 @@ +from mangopay.resources import Report, ReportV2 +from mangopay.utils import ReportFilter +from tests.test_base import BaseTestLive + + +class ReportsV2TestLive(BaseTestLive): + def test_ReportCreate(self): + report = ReportV2() + report.report_type = 'COLLECTED_FEES' + report.download_format = 'CSV' + report.after_date = 1740787200 + report.before_date = 1743544740 + result = report.save() + + self.assertIsNotNone(result) + self.assertTrue(result['id']) + self.assertEqual(result['report_type'], 'COLLECTED_FEES') + self.assertEqual(result['status'], 'PENDING') + + def test_ReportFilteredCreate(self): + report = ReportV2() + report.report_type = 'USER_WALLET_TRANSACTIONS' + report.download_format = 'CSV' + report.after_date = 1740787200 + report.before_date = 1743544740 + report.filters = ReportFilter() + report.filters.currency = 'EUR' + result = report.save() + + self.assertIsNotNone(result) + self.assertTrue(result['id']) + self.assertEqual(result['report_type'], 'USER_WALLET_TRANSACTIONS') + self.assertEqual(result['status'], 'PENDING') + + def test_ReportGet(self): + report = ReportV2() + report.report_type = 'COLLECTED_FEES' + report.download_format = 'CSV' + report.after_date = 1740787200 + report.before_date = 1743544740 + created = report.save() + result = Report.get(created['Id']) + + self.assertEqual(report.id, result.id) + + def test_Reports_All(self): + page = ReportV2.all(page=1, per_page=1) + result = page.data + + self.assertIsNotNone(result) + self.assertTrue(len(result) > 0) From c4dfa3b5f331cacea03963eb4b89b8ece92a0c22 Mon Sep 17 00:00:00 2001 From: Iulian Masar Date: Mon, 2 Jun 2025 11:52:58 +0300 Subject: [PATCH 2/3] added event types --- mangopay/constants.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mangopay/constants.py b/mangopay/constants.py index 689ee50..b211777 100644 --- a/mangopay/constants.py +++ b/mangopay/constants.py @@ -220,7 +220,10 @@ ('INSTANT_CONVERSION_FAILED', 'instant_conversion_failed', 'Instant Conversion Failed'), ('QUOTED_CONVERSION_CREATED', 'quoted_conversion_created', 'Quoted Conversion Created'), ('QUOTED_CONVERSION_SUCCEEDED', 'quoted_conversion_succeeded', 'Quoted Conversion Succeeded'), - ('QUOTED_CONVERSION_FAILED', 'quoted_conversion_failed', 'Quoted Conversion Failed') + ('QUOTED_CONVERSION_FAILED', 'quoted_conversion_failed', 'Quoted Conversion Failed'), + + ('REPORT_GENERATED', 'report_generated', 'Report Generated'), + ('REPORT_FAILED', 'report_failed', 'Report Failed') ) NOTIFICATION_STATUS_CHOICES = Choices( From e04c94ce3113f266a9b04bd978607f5e35b6e64d Mon Sep 17 00:00:00 2001 From: Iulian Masar Date: Tue, 3 Jun 2025 15:49:33 +0300 Subject: [PATCH 3/3] fixed tests --- mangopay/resources.py | 2 +- tests/test_reports_v2.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mangopay/resources.py b/mangopay/resources.py index 13e27b9..4b0ca2c 100644 --- a/mangopay/resources.py +++ b/mangopay/resources.py @@ -2421,7 +2421,7 @@ class Meta: verbose_name_plural = 'reportsv2' url = { InsertQuery.identifier: '/reporting/reports', - SelectQuery.identifier: '/reporting/reports/%(id)s' + SelectQuery.identifier: '/reporting/reports' } diff --git a/tests/test_reports_v2.py b/tests/test_reports_v2.py index 8ff2106..5aa5da2 100644 --- a/tests/test_reports_v2.py +++ b/tests/test_reports_v2.py @@ -1,4 +1,4 @@ -from mangopay.resources import Report, ReportV2 +from mangopay.resources import ReportV2 from mangopay.utils import ReportFilter from tests.test_base import BaseTestLive @@ -39,7 +39,7 @@ def test_ReportGet(self): report.after_date = 1740787200 report.before_date = 1743544740 created = report.save() - result = Report.get(created['Id']) + result = ReportV2.get(created['id']) self.assertEqual(report.id, result.id)