python-easyverein 2.1.1__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/PKG-INFO +1 -1
  2. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/__init__.py +1 -1
  3. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/api.py +3 -1
  4. python_easyverein-2.2.0/easyverein/models/billing_account.py +65 -0
  5. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/booking.py +4 -2
  6. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/contact_details.py +1 -1
  7. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/custom_field.py +1 -1
  8. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/invoice.py +2 -2
  9. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/invoice_item.py +2 -2
  10. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/member.py +17 -13
  11. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/member_group.py +4 -1
  12. python_easyverein-2.2.0/easyverein/modules/billing_account.py +27 -0
  13. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/pyproject.toml +1 -1
  14. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/LICENSE +0 -0
  15. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/README.md +0 -0
  16. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/core/__init__.py +0 -0
  17. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/core/client.py +0 -0
  18. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/core/exceptions.py +0 -0
  19. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/core/protocol.py +0 -0
  20. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/core/responses.py +0 -0
  21. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/core/types.py +0 -0
  22. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/core/validators.py +0 -0
  23. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/__init__.py +0 -0
  24. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/base.py +0 -0
  25. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/member_custom_field.py +0 -0
  26. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/member_member_group.py +0 -0
  27. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/mixins/__init__.py +0 -0
  28. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/mixins/empty_strings_mixin.py +0 -0
  29. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/models/mixins/required_attributes.py +0 -0
  30. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/__init__.py +0 -0
  31. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/booking.py +0 -0
  32. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/contact_details.py +0 -0
  33. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/custom_field.py +0 -0
  34. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/invoice.py +0 -0
  35. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/invoice_item.py +0 -0
  36. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/member.py +0 -0
  37. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/member_custom_field.py +0 -0
  38. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/member_group.py +0 -0
  39. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/member_member_group.py +0 -0
  40. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/mixins/__init__.py +0 -0
  41. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/mixins/crud.py +0 -0
  42. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/mixins/helper.py +0 -0
  43. {python_easyverein-2.1.1 → python_easyverein-2.2.0}/easyverein/modules/mixins/recycle_bin.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-easyverein
3
- Version: 2.1.1
3
+ Version: 2.2.0
4
4
  Summary: Python library to interact with the EasyVerein API
5
5
  Author: Daniel Herrmann
6
6
  Author-email: daniel.herrmann1@gmail.com
@@ -2,7 +2,7 @@
2
2
  Middleware for FastAPI that supports authenticating users against Keycloak
3
3
  """
4
4
 
5
- __version__ = "2.1.1"
5
+ __version__ = "2.2.0"
6
6
 
7
7
  # Export EasyVerein API directly
8
8
  from .api import EasyvereinAPI # noqa: F401
@@ -7,6 +7,7 @@ from typing import Callable, cast
7
7
 
8
8
  from .core.client import EasyvereinClient
9
9
  from .core.responses import BearerToken
10
+ from .modules.billing_account import BillingAccountMixin
10
11
  from .modules.booking import BookingMixin
11
12
  from .modules.contact_details import ContactDetailsMixin
12
13
  from .modules.custom_field import CustomFieldMixin
@@ -23,7 +24,7 @@ class EasyvereinAPI:
23
24
  def __init__(
24
25
  self,
25
26
  api_key,
26
- api_version="v1.7",
27
+ api_version="v2.0",
27
28
  base_url: str = "https://easyverein.com/api/",
28
29
  logger: logging.Logger | None = None,
29
30
  auto_retry=False,
@@ -59,6 +60,7 @@ class EasyvereinAPI:
59
60
 
60
61
  # Add methods
61
62
  self.booking = BookingMixin(self.c, self.logger)
63
+ self.billing_account = BillingAccountMixin(self.c, self.logger)
62
64
  self.contact_details = ContactDetailsMixin(self.c, self.logger)
63
65
  self.custom_field = CustomFieldMixin(self.c, self.logger)
64
66
  self.invoice = InvoiceMixin(self.c, self.logger)
@@ -0,0 +1,65 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import BaseModel, PositiveInt
4
+
5
+ from ..core.types import EasyVereinReference, FilterIntList, FilterStrList, PositiveIntWithZero
6
+ from .base import EasyVereinBase
7
+ from .mixins.empty_strings_mixin import EmptyStringsToNone
8
+ from .mixins.required_attributes import required_mixin
9
+
10
+
11
+ class BillingAccountBase(EasyVereinBase):
12
+ """
13
+ | Representative Model Class | Update Model Class | Create Model Class |
14
+ | --- | --- | --- |
15
+ | `BillingAccount` | `BillingAccountUpdate` | `BillingAccountCreate` |
16
+ """
17
+
18
+ name: str | None = None
19
+ excludeInEur: bool | None = None
20
+ number: PositiveInt | None = None
21
+ defaultSphere: PositiveInt | None = None
22
+
23
+
24
+ class BillingAccount(BillingAccountBase, EmptyStringsToNone):
25
+ """
26
+ Pydantic model representing an BillingAccount
27
+ """
28
+
29
+ skr: str | None = None
30
+ accountingPlans: list[EasyVereinReference] | None = None
31
+ numberLength: PositiveIntWithZero
32
+ linkedBookings: PositiveIntWithZero
33
+
34
+
35
+ class BillingAccountCreate(
36
+ BillingAccountBase,
37
+ required_mixin(["name", "number"]), # type: ignore
38
+ ):
39
+ """
40
+ Pydantic model representing a BillingAccount
41
+ """
42
+
43
+
44
+ class BillingAccountUpdate(BillingAccountBase):
45
+ """
46
+ Pydantic model used to patch an BillingAccount
47
+ """
48
+
49
+
50
+ class BillingAccountFilter(BaseModel):
51
+ """
52
+ Pydantic model used to filter billing accounts
53
+ """
54
+
55
+ id__in: FilterIntList | None = None
56
+ name: str | None = None
57
+ skr: str | None = None
58
+ skr__in: FilterStrList | None = None
59
+ number__gte: PositiveInt | None = None
60
+ number__lte: PositiveInt | None = None
61
+ deleted: bool | None = None
62
+ accountingPlan__isnull: bool | None = None
63
+ showOwnBillingAccounts: bool | None = None
64
+ ordering: str | None = None
65
+ search: str | None = None
@@ -22,8 +22,7 @@ class BookingBase(EasyVereinBase):
22
22
  amount: float | None = None
23
23
  # TODO: Add reference to BankAccount once implemented
24
24
  bankAccount: EasyVereinReference | None = None
25
- # TODO: Add reference to BillingAccount once implemented
26
- billingAccount: EasyVereinReference | None = None
25
+ billingAccount: BillingAccount | EasyVereinReference | None = None
27
26
  description: str | None = None
28
27
  date: DateTime | None = None
29
28
  receiver: str | None = None
@@ -98,3 +97,6 @@ class BookingFilter(BaseModel):
98
97
  relatedInvoice__isnull: bool | None = None
99
98
  relatedInvoice: int | None = None
100
99
  search: str | None = None
100
+
101
+
102
+ from .billing_account import BillingAccount # noqa: E402
@@ -148,7 +148,7 @@ class ContactDetailsFilter(BaseModel):
148
148
 
149
149
  id__in: FilterIntList | None = None
150
150
  country: str | None = None
151
- isCompany: bool = Field(default=None, serialization_alias="_isCompany")
151
+ isCompany: bool | None = Field(default=None, serialization_alias="_isCompany")
152
152
  preferredCommunicationWay: str | None = None
153
153
  contactDetailsGroups: str | None = None
154
154
  contactDetailsGroups__not: str | None = None
@@ -111,6 +111,6 @@ class CustomFieldFilter(BaseModel):
111
111
  kind: str | None = None
112
112
  member_edit: bool | None = None
113
113
  member_show: bool | None = None
114
- deletedBy__isnull: bool = Field(default=None, serialization_alias="_deletedBy__isnull")
114
+ deletedBy__isnull: bool | None = Field(default=None, serialization_alias="_deletedBy__isnull")
115
115
  deleted: bool | None = None
116
116
  ordering: str | None = None
@@ -55,8 +55,7 @@ class InvoiceBase(EasyVereinBase):
55
55
  ]
56
56
  | None
57
57
  ) = None
58
- # TODO: Add reference to BillingAccount once implemented
59
- selectionAcc: EasyVereinReference | None = None
58
+ selectionAcc: BillingAccount | EasyVereinReference | None = None
60
59
  refNumber: str | None = None
61
60
  paymentDifference: float | None = None
62
61
  isDraft: bool | None = None
@@ -148,6 +147,7 @@ class InvoiceFilter(BaseModel):
148
147
  search: str | None = None
149
148
 
150
149
 
150
+ from .billing_account import BillingAccount # noqa: E402
151
151
  from .contact_details import ContactDetails # noqa: E402
152
152
  from .invoice_item import InvoiceItem # noqa: E402
153
153
  from .member import Member # noqa: E402
@@ -35,8 +35,7 @@ class InvoiceItemBase(EasyVereinBase):
35
35
  taxRate: float | None = None
36
36
  gross: bool | None = None
37
37
  taxName: str | None = None
38
- # TODO: Add reference to BillingAccount once implemented
39
- billingAccount: EasyVereinReference | None = None
38
+ billingAccount: BillingAccount | EasyVereinReference | None = None
40
39
  costCentre: Annotated[str, Field(max_length=8)] | None = None
41
40
 
42
41
 
@@ -85,4 +84,5 @@ class InvoiceItemFilter(BaseModel):
85
84
  search: str | None = None
86
85
 
87
86
 
87
+ from .billing_account import BillingAccount # noqa: E402
88
88
  from .invoice import Invoice # noqa: E402
@@ -135,9 +135,9 @@ class MemberFilter(BaseModel):
135
135
  contactDetails__country: str | None = None
136
136
  membershipNumber: str | None = None
137
137
  membershipNumber__in: FilterStrList | None = None
138
- deletedBy: int = Field(default=None, serialization_alias="_deletedBy")
139
- deletedBy__ne: int = Field(default=None, serialization_alias="_deletedBy__ne")
140
- deletedBy__isnull: bool = Field(default=None, serialization_alias="_deletedBy__isnull")
138
+ deletedBy: int | None = Field(default=None, serialization_alias="_deletedBy")
139
+ deletedBy__ne: int | None = Field(default=None, serialization_alias="_deletedBy__ne")
140
+ deletedBy__isnull: bool | None = Field(default=None, serialization_alias="_deletedBy__isnull")
141
141
  joinDate: DateTime | None = None
142
142
  joinDate__gte: DateTime | None = None
143
143
  joinDate__lte: DateTime | None = None
@@ -146,18 +146,22 @@ class MemberFilter(BaseModel):
146
146
  resignationDate__gte: DateTime | None = None
147
147
  resignationDate__lte: DateTime | None = None
148
148
  resignationDate__isnull: bool | None = None
149
- isApplication: bool = Field(default=None, serialization_alias="_isApplication")
150
- applicationDate: Date = Field(default=None, serialization_alias="_applicationDate")
151
- applicationDate__gte: Date = Field(default=None, serialization_alias="_applicationDate__gte")
152
- applicationDate__lte: Date = Field(default=None, serialization_alias="_applicationDate__lte")
153
- applicationDate__isnull: bool = Field(default=None, serialization_alias="_applicationDate__isnull")
154
- applicationWasAcceptedAt: Date = Field(default=None, serialization_alias="_applicationWasAcceptedAt")
155
- applicationWasAcceptedAt__gte: Date = Field(default=None, serialization_alias="_applicationWasAcceptedAt__gte")
156
- applicationWasAcceptedAt__lte: Date = Field(default=None, serialization_alias="_applicationWasAcceptedAt__lte")
157
- applicationWasAcceptedAt__isnull: bool = Field(
149
+ isApplication: bool | None = Field(default=None, serialization_alias="_isApplication")
150
+ applicationDate: Date | None = Field(default=None, serialization_alias="_applicationDate")
151
+ applicationDate__gte: Date | None = Field(default=None, serialization_alias="_applicationDate__gte")
152
+ applicationDate__lte: Date | None = Field(default=None, serialization_alias="_applicationDate__lte")
153
+ applicationDate__isnull: bool | None = Field(default=None, serialization_alias="_applicationDate__isnull")
154
+ applicationWasAcceptedAt: Date | None = Field(default=None, serialization_alias="_applicationWasAcceptedAt")
155
+ applicationWasAcceptedAt__gte: Date | None = Field(
156
+ default=None, serialization_alias="_applicationWasAcceptedAt__gte"
157
+ )
158
+ applicationWasAcceptedAt__lte: Date | None = Field(
159
+ default=None, serialization_alias="_applicationWasAcceptedAt__lte"
160
+ )
161
+ applicationWasAcceptedAt__isnull: bool | None = Field(
158
162
  default=None, serialization_alias="_applicationWasAcceptedAt__isnull"
159
163
  )
160
- isChairman: bool = Field(default=None, serialization_alias="_isChairman")
164
+ isChairman: bool | None = Field(default=None, serialization_alias="_isChairman")
161
165
  memberGroups: FilterIntList | None = None
162
166
  """
163
167
  Filter for members that are member of the given group(s)
@@ -48,7 +48,7 @@ class MemberGroupBase(EasyVereinBase):
48
48
  agePermission: PositiveIntWithZero | None = None
49
49
  nextGroup: EasyVereinReference | None = None
50
50
  taxRate: float | None = None
51
- billingAccount: EasyVereinReference | None = None
51
+ billingAccount: BillingAccount | EasyVereinReference | None = None
52
52
  costCentre: str | None = Field(default=None, max_length=8)
53
53
  isOnlyVisibleToAdmins: bool | None = None
54
54
  user_shares: Literal["n", "a", "d"] | None = None
@@ -153,3 +153,6 @@ class MemberGroupFilter(BaseModel):
153
153
  kind: str | None = None
154
154
  deleted: bool | None = None
155
155
  ordering: str | None = None
156
+
157
+
158
+ from .billing_account import BillingAccount # noqa: E402
@@ -0,0 +1,27 @@
1
+ """
2
+ All methods related to billing accounts
3
+ """
4
+
5
+ import logging
6
+
7
+ from ..core.client import EasyvereinClient
8
+ from ..models.billing_account import (
9
+ BillingAccount,
10
+ BillingAccountCreate,
11
+ BillingAccountFilter,
12
+ BillingAccountUpdate,
13
+ )
14
+ from .mixins.crud import CRUDMixin
15
+ from .mixins.recycle_bin import RecycleBinMixin
16
+
17
+
18
+ class BillingAccountMixin(
19
+ CRUDMixin[BillingAccount, BillingAccountCreate, BillingAccountUpdate, BillingAccountFilter],
20
+ RecycleBinMixin[BillingAccount],
21
+ ):
22
+ def __init__(self, client: EasyvereinClient, logger: logging.Logger):
23
+ super().__init__()
24
+ self.endpoint_name = "billing-account"
25
+ self.return_type = BillingAccount
26
+ self.c = client
27
+ self.logger = logger
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-easyverein"
3
- version = "2.1.1"
3
+ version = "2.2.0"
4
4
  description = "Python library to interact with the EasyVerein API"
5
5
  authors = ["Daniel Herrmann <daniel.herrmann1@gmail.com>"]
6
6
  readme = "README.md"