Compare commits
9 Commits
e5462a0063
...
ad93c361fd
Author | SHA1 | Date | |
---|---|---|---|
ad93c361fd | |||
fe03146bc6 | |||
d96de225bd | |||
35d74f7bc3 | |||
fd26e2b17d | |||
d12ac8f568 | |||
6c55f04108 | |||
95c8c883ce | |||
2ab94b0d5e |
@ -613,18 +613,26 @@ class EventExt(Event):
|
||||
return self.instructor.member == member
|
||||
return False
|
||||
|
||||
@property
|
||||
def missing_for_invoice(self) -> list[str]:
|
||||
reasons = {
|
||||
"Missing instructor": self.instructor is None,
|
||||
"Instructor not linked to a member": (
|
||||
self.instructor is not None and self.instructor.member is None
|
||||
),
|
||||
"Missing materials fee": self.materials_fee is None,
|
||||
"Materials fee is not 0 and materials_fee_included_in_price not defined": (
|
||||
self.materials_fee != 0 and self.materials_fee_included_in_price is None
|
||||
),
|
||||
"total_due_to_instructor is None (this can have several causes)": (
|
||||
self.total_due_to_instructor is None
|
||||
),
|
||||
}
|
||||
return [k for k, v in reasons.items() if v]
|
||||
|
||||
@property
|
||||
def ready_for_invoice(self) -> bool:
|
||||
return (
|
||||
self.instructor is not None
|
||||
and self.instructor.member is not None
|
||||
and self.materials_fee is not None
|
||||
and (
|
||||
self.materials_fee_included_in_price is not None
|
||||
or self.materials_fee == 0
|
||||
)
|
||||
and self.total_due_to_instructor is not None
|
||||
)
|
||||
return len(self.missing_for_invoice) == 0
|
||||
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@ -696,11 +704,8 @@ class EventInvoice(models.Model):
|
||||
|
||||
class EventTicketTypeQuerySet(models.QuerySet["EventTicketType"]):
|
||||
def group_by_ticket_type(self):
|
||||
return self.values(is_members_ticket=Q(restrict_to__isnull=False)).annotate(
|
||||
label=Case(
|
||||
When(Q(is_members_ticket=True), Value("Members")),
|
||||
default=Value("Non-Members"),
|
||||
),
|
||||
return self.values("price_group").annotate(
|
||||
label=F("price_group"),
|
||||
actual_price=F("actual_price"),
|
||||
**{
|
||||
field: Sum(field)
|
||||
@ -724,25 +729,31 @@ class EventTicketTypeManager(models.Manager["EventTicketType"]):
|
||||
# restricted ticket, but list price for unrestricted
|
||||
# (Non-Members) ticket. After, use Members ticket price
|
||||
# for all tickets except where members ticket is free.
|
||||
actual_price=Case(
|
||||
price_group=Case(
|
||||
When(
|
||||
# member ticket
|
||||
Q(restrict_to__has_key=settings.MW_MEMBERS_FOLDER_ID)
|
||||
| (
|
||||
# non-member ticket
|
||||
Q(restrict_to__isnull=True)
|
||||
& (
|
||||
Q(
|
||||
event__start__lt=datetime(
|
||||
year=2024,
|
||||
month=7,
|
||||
day=1,
|
||||
tzinfo=timezone.get_default_timezone(),
|
||||
)
|
||||
)
|
||||
| Q(members_price=0)
|
||||
Q(members_price=0)
|
||||
| Q(
|
||||
event__start__lt=datetime(
|
||||
year=2024,
|
||||
month=7,
|
||||
day=1,
|
||||
tzinfo=timezone.get_default_timezone(),
|
||||
)
|
||||
),
|
||||
Case(
|
||||
When(Q(restrict_to__isnull=True), Value("Non-Members")),
|
||||
default=Value("Members"),
|
||||
),
|
||||
),
|
||||
default=Value("Attendee"),
|
||||
),
|
||||
actual_price=Case(
|
||||
# Price group will be "Non-Members" iff we are using
|
||||
# the list price for that ticket type. In all other
|
||||
# cases (special program discounts or non-members
|
||||
# tickets after 2024-07-01), use the members price
|
||||
When(
|
||||
Q(price_group=Value("Non-Members")),
|
||||
"list_price",
|
||||
),
|
||||
default="members_price",
|
||||
|
@ -153,7 +153,7 @@ class CurrentAndUpcomingEventTable(EventTable):
|
||||
sequence = ("title", "start", "next_meeting")
|
||||
|
||||
|
||||
class MoneyFooterColumn(MoneyColumn):
|
||||
class MoneyFooterColumn(CurrencySymbolMoneyColumn):
|
||||
def render_footer(self, bound_column, table):
|
||||
value = getattr(table.event, bound_column.accessor)
|
||||
if value is not None:
|
||||
@ -182,18 +182,16 @@ class InvoiceTable(tables.Table):
|
||||
_math_header("Quantity", "Q"),
|
||||
footer=lambda table: table.event.quantity,
|
||||
)
|
||||
amount = CurrencySymbolMoneyColumn(_math_header("Amount", "A=P*Q"))
|
||||
materials = CurrencySymbolMoneyColumn(
|
||||
_math_header("CMS Collected Materials Fee", "M=m*Q")
|
||||
)
|
||||
amount_without_materials = CurrencySymbolMoneyColumn(
|
||||
amount = MoneyFooterColumn(_math_header("Amount", "A=P*Q"))
|
||||
materials = MoneyFooterColumn(_math_header("CMS Collected Materials Fee", "M=m*Q"))
|
||||
amount_without_materials = MoneyFooterColumn(
|
||||
_math_header("Event Revenue Base", "B=A-M")
|
||||
)
|
||||
instructor_revenue = CurrencySymbolMoneyColumn(
|
||||
instructor_revenue = MoneyFooterColumn(
|
||||
_math_header("Instructor Percentage Revenue", "R=B*I"),
|
||||
)
|
||||
instructor_amount = CurrencySymbolMoneyColumn(
|
||||
_math_header("Amount Due to Instructor", "R+M")
|
||||
instructor_amount = MoneyFooterColumn(
|
||||
_math_header("Amount Due to Instructor", "R+M"),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
|
@ -38,6 +38,14 @@
|
||||
{% elif not event.ready_for_invoice %}
|
||||
<p class="card-text text-center">
|
||||
This event is missing required information to generate an invoice. Please contact us at <a href="mailto:info@claremontmakerspace.org">info@claremontmakerspace.org</a>.
|
||||
{% if perms.membershipworks.view_event %}
|
||||
<div>
|
||||
<h5>Issues:</h5>
|
||||
<ul>
|
||||
{{ event.missing_for_invoice|unordered_list }}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
</p>
|
||||
{% elif user_is_instructor %}
|
||||
<form method="post" class="card-text">
|
||||
|
@ -2,22 +2,24 @@
|
||||
|
||||
{% block table.tfoot %}
|
||||
{% if table.has_footer %}
|
||||
<tfoot {{ table.attrs.tfoot.as_html }}>
|
||||
<tr>
|
||||
{% for column in table.columns %}
|
||||
{% if forloop.first %}
|
||||
<th for="row" {{ column.attrs.tf.as_html }}>
|
||||
{{ column.footer }}
|
||||
</th>
|
||||
{% else %}
|
||||
<td {{ column.attrs.tf.as_html }}>
|
||||
{{ column.footer }}
|
||||
</td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% if table.event.instructor_flat_rate != 0 %}
|
||||
{% if table.rows|length > 1 %}
|
||||
<tfoot {{ table.attrs.tfoot.as_html }}>
|
||||
<tr>
|
||||
{% for column in table.columns %}
|
||||
{% if forloop.first %}
|
||||
<th for="row" {{ column.attrs.tf.as_html }}>
|
||||
{{ column.footer }}
|
||||
</th>
|
||||
{% else %}
|
||||
<td {{ column.attrs.tf.as_html }}>
|
||||
{{ column.footer }}
|
||||
</td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if table.event.instructor_flat_rate != 0 %}
|
||||
<tr class="text-end">
|
||||
<td colspan="{{ table.columns|length|add:-2 }}"></td>
|
||||
<th scope="row">Flat Rate</th>
|
||||
<td>
|
||||
@ -29,7 +31,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<tr class="text-end">
|
||||
<td colspan="{{ table.columns|length|add:-2 }}"></td>
|
||||
<th scope="row">Total</th>
|
||||
<td>
|
||||
|
90
pdm.lock
generated
90
pdm.lock
generated
@ -5,7 +5,7 @@
|
||||
groups = ["default", "debug", "dev", "lint", "server", "typing"]
|
||||
strategy = ["inherit_metadata"]
|
||||
lock_version = "4.5.0"
|
||||
content_hash = "sha256:cbc004328929d6528e9327bc04cd9f07e3cb3923b26f70e35a1f158dee729785"
|
||||
content_hash = "sha256:6ff29c3c933c9e42658874ca80b75ba25f6df9ad51917b7b145630d7a3cbf772"
|
||||
|
||||
[[metadata.targets]]
|
||||
requires_python = "==3.11.*"
|
||||
@ -269,14 +269,14 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "coverage"
|
||||
version = "7.6.4"
|
||||
version = "7.6.8"
|
||||
requires_python = ">=3.9"
|
||||
summary = "Code coverage measurement for Python"
|
||||
groups = ["dev"]
|
||||
marker = "python_version == \"3.11\""
|
||||
files = [
|
||||
{file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"},
|
||||
{file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"},
|
||||
{file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb"},
|
||||
{file = "coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -886,7 +886,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "djlint"
|
||||
version = "1.36.0"
|
||||
version = "1.36.1"
|
||||
requires_python = ">=3.9"
|
||||
summary = "HTML Template Linter and Formatter"
|
||||
groups = ["lint"]
|
||||
@ -904,9 +904,9 @@ dependencies = [
|
||||
"tqdm>=4.62.2",
|
||||
]
|
||||
files = [
|
||||
{file = "djlint-1.36.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd55db8740a7e454558809fd489c54303a85da33ad2724b3e7686c1f96145b7d"},
|
||||
{file = "djlint-1.36.0-py3-none-any.whl", hash = "sha256:dc10fe009b8d6dfafa800b326e8e3cfff6267d7040a485ff635f2ff09e200a44"},
|
||||
{file = "djlint-1.36.0.tar.gz", hash = "sha256:c6a16905d69d02bfd745084a3ebf065707efbaf0a31762b34441802beb206b51"},
|
||||
{file = "djlint-1.36.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:001e5124b0ebab60a2044134abd11ff11dee772e7c3caaa2c8d12eb5d3b1f1dc"},
|
||||
{file = "djlint-1.36.1-py3-none-any.whl", hash = "sha256:950782b396dd82b74622c09d7e4c52328e56a3b03c8ac790c319708e5caa0686"},
|
||||
{file = "djlint-1.36.1.tar.gz", hash = "sha256:f7260637ed72c270fa6dd4a87628e1a21c49b24a46df52e4e26f44d4934fb97c"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1030,7 +1030,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "google-api-python-client"
|
||||
version = "2.151.0"
|
||||
version = "2.154.0"
|
||||
requires_python = ">=3.7"
|
||||
summary = "Google API Client Library for Python"
|
||||
groups = ["default", "typing"]
|
||||
@ -1043,8 +1043,8 @@ dependencies = [
|
||||
"uritemplate<5,>=3.0.1",
|
||||
]
|
||||
files = [
|
||||
{file = "google_api_python_client-2.151.0-py2.py3-none-any.whl", hash = "sha256:4427b2f47cd88b0355d540c2c52215f68c337f3bc9d6aae1ceeae4525977504c"},
|
||||
{file = "google_api_python_client-2.151.0.tar.gz", hash = "sha256:a9d26d630810ed4631aea21d1de3e42072f98240aaf184a8a1a874a371115034"},
|
||||
{file = "google_api_python_client-2.154.0-py2.py3-none-any.whl", hash = "sha256:a521bbbb2ec0ba9d6f307cdd64ed6e21eeac372d1bd7493a4ab5022941f784ad"},
|
||||
{file = "google_api_python_client-2.154.0.tar.gz", hash = "sha256:1b420062e03bfcaa1c79e2e00a612d29a6a934151ceb3d272fe150a656dc8f17"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1172,7 +1172,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "hypothesis"
|
||||
version = "6.116.0"
|
||||
version = "6.119.4"
|
||||
requires_python = ">=3.9"
|
||||
summary = "A library for property-based testing"
|
||||
groups = ["dev"]
|
||||
@ -1183,13 +1183,13 @@ dependencies = [
|
||||
"sortedcontainers<3.0.0,>=2.1.0",
|
||||
]
|
||||
files = [
|
||||
{file = "hypothesis-6.116.0-py3-none-any.whl", hash = "sha256:d30271214eae0d4758b72b408e9777405c7c7f687e14e8a42853adea887b2891"},
|
||||
{file = "hypothesis-6.116.0.tar.gz", hash = "sha256:9c1ac9a2edb77aacae1950d8ded6b3f40dbf8483097c88336265c348d2132c71"},
|
||||
{file = "hypothesis-6.119.4-py3-none-any.whl", hash = "sha256:333958da7855048850c3d2b6a929d44a3c89ca9eafcfddcacc3570140915eba5"},
|
||||
{file = "hypothesis-6.119.4.tar.gz", hash = "sha256:1a7d12709c0e96c1d85aca76d1594b34b5958623e00511592eba674acd4f3392"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hypothesis"
|
||||
version = "6.116.0"
|
||||
version = "6.119.4"
|
||||
extras = ["django"]
|
||||
requires_python = ">=3.9"
|
||||
summary = "A library for property-based testing"
|
||||
@ -1197,11 +1197,11 @@ groups = ["dev"]
|
||||
marker = "python_version == \"3.11\""
|
||||
dependencies = [
|
||||
"django>=4.2",
|
||||
"hypothesis==6.116.0",
|
||||
"hypothesis==6.119.4",
|
||||
]
|
||||
files = [
|
||||
{file = "hypothesis-6.116.0-py3-none-any.whl", hash = "sha256:d30271214eae0d4758b72b408e9777405c7c7f687e14e8a42853adea887b2891"},
|
||||
{file = "hypothesis-6.116.0.tar.gz", hash = "sha256:9c1ac9a2edb77aacae1950d8ded6b3f40dbf8483097c88336265c348d2132c71"},
|
||||
{file = "hypothesis-6.119.4-py3-none-any.whl", hash = "sha256:333958da7855048850c3d2b6a929d44a3c89ca9eafcfddcacc3570140915eba5"},
|
||||
{file = "hypothesis-6.119.4.tar.gz", hash = "sha256:1a7d12709c0e96c1d85aca76d1594b34b5958623e00511592eba674acd4f3392"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1327,7 +1327,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "markdownify"
|
||||
version = "0.13.1"
|
||||
version = "0.14.1"
|
||||
summary = "Convert HTML to markdown."
|
||||
groups = ["default"]
|
||||
marker = "python_version == \"3.11\""
|
||||
@ -1336,8 +1336,8 @@ dependencies = [
|
||||
"six<2,>=1.15",
|
||||
]
|
||||
files = [
|
||||
{file = "markdownify-0.13.1-py3-none-any.whl", hash = "sha256:1d181d43d20902bcc69d7be85b5316ed174d0dda72ff56e14ae4c95a4a407d22"},
|
||||
{file = "markdownify-0.13.1.tar.gz", hash = "sha256:ab257f9e6bd4075118828a28c9d02f8a4bfeb7421f558834aa79b2dfeb32a098"},
|
||||
{file = "markdownify-0.14.1-py3-none-any.whl", hash = "sha256:4c46a6c0c12c6005ddcd49b45a5a890398b002ef51380cd319db62df5e09bc2a"},
|
||||
{file = "markdownify-0.14.1.tar.gz", hash = "sha256:a62a7a216947ed0b8dafb95b99b2ef4a0edd1e18d5653c656f68f03db2bfb2f1"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1357,7 +1357,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "mdformat"
|
||||
version = "0.7.18"
|
||||
version = "0.7.19"
|
||||
requires_python = ">=3.9"
|
||||
summary = "CommonMark compliant Markdown formatter"
|
||||
groups = ["default"]
|
||||
@ -1368,8 +1368,8 @@ dependencies = [
|
||||
"tomli>=1.1.0; python_version < \"3.11\"",
|
||||
]
|
||||
files = [
|
||||
{file = "mdformat-0.7.18-py3-none-any.whl", hash = "sha256:0060cff2a9d53a2c29a4b2be56ff90cc210d2e8506684fa482c9846166f05e22"},
|
||||
{file = "mdformat-0.7.18.tar.gz", hash = "sha256:42cba8bc5a6bb12d50bdf7c1e470c1f837a8ab8ce81571d4e53b9e62051f6e4f"},
|
||||
{file = "mdformat-0.7.19-py3-none-any.whl", hash = "sha256:5c360992adc118cf1479cbbe92bb3bd66dcd7f1a5a3a2ad6675915622c678cf1"},
|
||||
{file = "mdformat-0.7.19.tar.gz", hash = "sha256:a7d22df9802383432367864da907d2d147485b5cb6872e2d66937c1333e4d58a"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1952,14 +1952,14 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "ruff"
|
||||
version = "0.7.2"
|
||||
version = "0.8.0"
|
||||
requires_python = ">=3.7"
|
||||
summary = "An extremely fast Python linter and code formatter, written in Rust."
|
||||
groups = ["lint"]
|
||||
marker = "python_version == \"3.11\""
|
||||
files = [
|
||||
{file = "ruff-0.7.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba53ed84ac19ae4bfb4ea4bf0172550a2285fa27fbb13e3746f04c80f7fa088"},
|
||||
{file = "ruff-0.7.2.tar.gz", hash = "sha256:2b14e77293380e475b4e3a7a368e14549288ed2931fce259a6f99978669e844f"},
|
||||
{file = "ruff-0.8.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a8e86bae0dbd749c815211ca11e3a7bd559b9710746c559ed63106d382bd9c"},
|
||||
{file = "ruff-0.8.0.tar.gz", hash = "sha256:a7ccfe6331bf8c8dad715753e157457faf7351c2b69f62f32c165c2dbcbacd44"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1976,14 +1976,14 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "setuptools"
|
||||
version = "75.3.0"
|
||||
requires_python = ">=3.8"
|
||||
version = "75.6.0"
|
||||
requires_python = ">=3.9"
|
||||
summary = "Easily download, build, install, upgrade, and uninstall Python packages"
|
||||
groups = ["server", "typing"]
|
||||
marker = "python_version == \"3.11\""
|
||||
files = [
|
||||
{file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"},
|
||||
{file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"},
|
||||
{file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"},
|
||||
{file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2192,7 +2192,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "types-bleach"
|
||||
version = "6.1.0.20240331"
|
||||
version = "6.2.0.20241123"
|
||||
requires_python = ">=3.8"
|
||||
summary = "Typing stubs for bleach"
|
||||
groups = ["typing"]
|
||||
@ -2201,8 +2201,8 @@ dependencies = [
|
||||
"types-html5lib",
|
||||
]
|
||||
files = [
|
||||
{file = "types-bleach-6.1.0.20240331.tar.gz", hash = "sha256:2ee858a84fb06fc2225ff56ba2f7f6c88b65638659efae0d7bfd6b24a1b5a524"},
|
||||
{file = "types_bleach-6.1.0.20240331-py3-none-any.whl", hash = "sha256:399bc59bfd20a36a56595f13f805e56c8a08e5a5c07903e5cf6fafb5a5107dd4"},
|
||||
{file = "types_bleach-6.2.0.20241123-py3-none-any.whl", hash = "sha256:c6e58b3646665ca7c6b29890375390f4569e84f0cf5c171e0fe1ddb71a7be86a"},
|
||||
{file = "types_bleach-6.2.0.20241123.tar.gz", hash = "sha256:dac5fe9015173514da3ac810c1a935619a3ccbcc5d66c4cbf4707eac00539057"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2243,7 +2243,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "types-lxml"
|
||||
version = "2024.9.16"
|
||||
version = "2024.11.8"
|
||||
requires_python = ">=3.8"
|
||||
summary = "Complete lxml external type annotation"
|
||||
groups = ["typing"]
|
||||
@ -2254,8 +2254,8 @@ dependencies = [
|
||||
"typing-extensions~=4.10; python_version < \"3.13\"",
|
||||
]
|
||||
files = [
|
||||
{file = "types_lxml-2024.9.16-py3-none-any.whl", hash = "sha256:bde062b76e701555aa84c23ba1cc6b22a3855dc1bf6970f48c04f2aab3ba806d"},
|
||||
{file = "types_lxml-2024.9.16.tar.gz", hash = "sha256:1005984c8da5ceb929b5f168a804b8b7217c8e0c6459fa205aa19fd8d75571ab"},
|
||||
{file = "types_lxml-2024.11.8-py3-none-any.whl", hash = "sha256:4b4fa7f9e2f1d5f58b98ac9852a75927e4e0f69363249f9cebc78db095c046e0"},
|
||||
{file = "types_lxml-2024.11.8.tar.gz", hash = "sha256:0cdb4d943cb104e019b7273fd24af72a0826d0043b3e5100b672c3bb99028e00"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2417,7 +2417,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "uvicorn"
|
||||
version = "0.32.0"
|
||||
version = "0.32.1"
|
||||
requires_python = ">=3.8"
|
||||
summary = "The lightning-fast ASGI server."
|
||||
groups = ["server"]
|
||||
@ -2428,13 +2428,13 @@ dependencies = [
|
||||
"typing-extensions>=4.0; python_version < \"3.11\"",
|
||||
]
|
||||
files = [
|
||||
{file = "uvicorn-0.32.0-py3-none-any.whl", hash = "sha256:60b8f3a5ac027dcd31448f411ced12b5ef452c646f76f02f8cc3f25d8d26fd82"},
|
||||
{file = "uvicorn-0.32.0.tar.gz", hash = "sha256:f78b36b143c16f54ccdb8190d0a26b5f1901fe5a3c777e1ab29f26391af8551e"},
|
||||
{file = "uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e"},
|
||||
{file = "uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "uvicorn"
|
||||
version = "0.32.0"
|
||||
version = "0.32.1"
|
||||
extras = ["standard"]
|
||||
requires_python = ">=3.8"
|
||||
summary = "The lightning-fast ASGI server."
|
||||
@ -2442,17 +2442,17 @@ groups = ["server"]
|
||||
marker = "python_version == \"3.11\""
|
||||
dependencies = [
|
||||
"colorama>=0.4; sys_platform == \"win32\"",
|
||||
"httptools>=0.5.0",
|
||||
"httptools>=0.6.3",
|
||||
"python-dotenv>=0.13",
|
||||
"pyyaml>=5.1",
|
||||
"uvicorn==0.32.0",
|
||||
"uvicorn==0.32.1",
|
||||
"uvloop!=0.15.0,!=0.15.1,>=0.14.0; (sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"",
|
||||
"watchfiles>=0.13",
|
||||
"websockets>=10.4",
|
||||
]
|
||||
files = [
|
||||
{file = "uvicorn-0.32.0-py3-none-any.whl", hash = "sha256:60b8f3a5ac027dcd31448f411ced12b5ef452c646f76f02f8cc3f25d8d26fd82"},
|
||||
{file = "uvicorn-0.32.0.tar.gz", hash = "sha256:f78b36b143c16f54ccdb8190d0a26b5f1901fe5a3c777e1ab29f26391af8551e"},
|
||||
{file = "uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e"},
|
||||
{file = "uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
224
pyproject.toml
224
pyproject.toml
@ -7,93 +7,93 @@ name = "cmsmanage"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = [
|
||||
{ name = "Adam Goldsmith", email = "contact@adamgoldsmith.name" },
|
||||
{ name = "Adam Goldsmith", email = "contact@adamgoldsmith.name" },
|
||||
]
|
||||
requires-python = ">=3.11"
|
||||
|
||||
classifiers = [
|
||||
"Programming Language :: Python :: 3 :: Only",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Programming Language :: Python :: 3.13",
|
||||
"Programming Language :: Python :: 3 :: Only",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Programming Language :: Python :: 3.13",
|
||||
]
|
||||
dependencies = [
|
||||
"bitstring~=4.2",
|
||||
"django~=5.1",
|
||||
"django-admin-logs~=1.3",
|
||||
"django-auth-ldap~=5.1",
|
||||
"django-autocomplete-light~=3.11",
|
||||
"django-bootstrap5~=24.3",
|
||||
"django-configurations[database,email]~=2.5",
|
||||
"django-db-views~=0.1",
|
||||
"django-filter~=24.3",
|
||||
"django-markdownx~=4.0",
|
||||
"django-model-utils~=5.0",
|
||||
"django-nh3~=0.1",
|
||||
"django-object-actions~=4.3",
|
||||
"django-postgres-metrics~=0.15",
|
||||
"django-q2~=1.7",
|
||||
"django-recurrence~=1.11",
|
||||
"django-sendfile2~=0.7",
|
||||
"django-simple-history~=3.7",
|
||||
"django-stubs-ext~=5.1",
|
||||
"django-tables2~=2.7",
|
||||
"django-template-partials~=24.4",
|
||||
"django-vite~=3.0",
|
||||
"django-weasyprint~=2.3",
|
||||
"django-widget-tweaks~=1.5",
|
||||
"djangorestframework~=3.15",
|
||||
"google-api-python-client~=2.151",
|
||||
"google-auth-oauthlib~=1.2",
|
||||
"lxml~=5.3",
|
||||
"markdownify~=0.13",
|
||||
"mdformat~=0.7",
|
||||
"mdformat-tables~=1.0",
|
||||
"nh3~=0.2",
|
||||
"openapi-client-udm~=1.0",
|
||||
"psycopg[binary,pool]~=3.2",
|
||||
"requests~=2.32",
|
||||
"semver~=3.0",
|
||||
"tablib[ods,xlsx]~=3.7",
|
||||
"udm-rest-client~=1.2",
|
||||
"weasyprint~=63.0",
|
||||
"bitstring~=4.2",
|
||||
"django~=5.1",
|
||||
"django-admin-logs~=1.3",
|
||||
"django-auth-ldap~=5.1",
|
||||
"django-autocomplete-light~=3.11",
|
||||
"django-bootstrap5~=24.3",
|
||||
"django-configurations[database,email]~=2.5",
|
||||
"django-db-views~=0.1",
|
||||
"django-filter~=24.3",
|
||||
"django-markdownx~=4.0",
|
||||
"django-model-utils~=5.0",
|
||||
"django-nh3~=0.1",
|
||||
"django-object-actions~=4.3",
|
||||
"django-postgres-metrics~=0.15",
|
||||
"django-q2~=1.7",
|
||||
"django-recurrence~=1.11",
|
||||
"django-sendfile2~=0.7",
|
||||
"django-simple-history~=3.7",
|
||||
"django-stubs-ext~=5.1",
|
||||
"django-tables2~=2.7",
|
||||
"django-template-partials~=24.4",
|
||||
"django-vite~=3.0",
|
||||
"django-weasyprint~=2.3",
|
||||
"django-widget-tweaks~=1.5",
|
||||
"djangorestframework~=3.15",
|
||||
"google-api-python-client~=2.154",
|
||||
"google-auth-oauthlib~=1.2",
|
||||
"lxml~=5.3",
|
||||
"markdownify~=0.14",
|
||||
"mdformat~=0.7",
|
||||
"mdformat-tables~=1.0",
|
||||
"nh3~=0.2",
|
||||
"openapi-client-udm~=1.0",
|
||||
"psycopg[binary,pool]~=3.2",
|
||||
"requests~=2.32",
|
||||
"semver~=3.0",
|
||||
"tablib[ods,xlsx]~=3.7",
|
||||
"udm-rest-client~=1.2",
|
||||
"weasyprint~=63.0",
|
||||
]
|
||||
optional-dependencies.server = [
|
||||
"setuptools~=75.3",
|
||||
"uvicorn[standard]~=0.32",
|
||||
"setuptools~=75.6",
|
||||
"uvicorn[standard]~=0.32",
|
||||
]
|
||||
entry-points."djangoq.errorreporters".admin_email = "cmsmanage.django_q2_admin_email_reporter:AdminEmailReporter"
|
||||
|
||||
[dependency-groups]
|
||||
dev = [
|
||||
"coverage~=7.6",
|
||||
"django-extensions~=3.2",
|
||||
"hypothesis[django]~=6.116",
|
||||
"ipython~=8.29",
|
||||
"tblib~=3.0",
|
||||
"coverage~=7.6",
|
||||
"django-extensions~=3.2",
|
||||
"hypothesis[django]~=6.119",
|
||||
"ipython~=8.29",
|
||||
"tblib~=3.0",
|
||||
]
|
||||
debug = [
|
||||
"django-debug-toolbar~=4.4",
|
||||
"django-debug-toolbar~=4.4",
|
||||
]
|
||||
lint = [
|
||||
"djlint~=1.36",
|
||||
"pyproject-fmt~=2.5",
|
||||
"ruff~=0.7",
|
||||
"djlint~=1.36",
|
||||
"pyproject-fmt~=2.5",
|
||||
"ruff~=0.8",
|
||||
]
|
||||
typing = [
|
||||
"django-stubs~=5.1",
|
||||
"djangorestframework-stubs[compatible-mypy]~=3.15",
|
||||
"google-api-python-client-stubs~=1.28",
|
||||
"mypy~=1.11",
|
||||
"setuptools~=75.3",
|
||||
"types-bleach~=6.1",
|
||||
"types-lxml~=2024.9",
|
||||
"types-markdown~=3.7",
|
||||
"types-psycopg2~=2.9",
|
||||
"types-pygments~=2.18",
|
||||
"types-python-dateutil~=2.9",
|
||||
"types-requests~=2.32",
|
||||
"types-urllib3~=1.26",
|
||||
"django-stubs~=5.1",
|
||||
"djangorestframework-stubs[compatible-mypy]~=3.15",
|
||||
"google-api-python-client-stubs~=1.28",
|
||||
"mypy~=1.11",
|
||||
"setuptools~=75.6",
|
||||
"types-bleach~=6.2",
|
||||
"types-lxml~=2024.11",
|
||||
"types-markdown~=3.7",
|
||||
"types-psycopg2~=2.9",
|
||||
"types-pygments~=2.18",
|
||||
"types-python-dateutil~=2.9",
|
||||
"types-requests~=2.32",
|
||||
"types-urllib3~=1.26",
|
||||
]
|
||||
|
||||
[[tool.pdm.source]]
|
||||
@ -106,6 +106,7 @@ url = "https://git.claremontmakerspace.org/api/packages/CMS/pypi/simple"
|
||||
verify_ssl = true
|
||||
name = "CMS"
|
||||
include_packages = [ "openapi-client-udm" ]
|
||||
exclude_packages = [ "*" ]
|
||||
|
||||
[tool.pdm.scripts]
|
||||
start = "./manage.py runserver"
|
||||
@ -115,63 +116,66 @@ fmt.shell = "ruff check --fix ; ruff format . ; djlint --reformat ."
|
||||
line-length = 88
|
||||
|
||||
lint.select = [
|
||||
"A",
|
||||
"B",
|
||||
"C4",
|
||||
"DJ012",
|
||||
"E4",
|
||||
"E7",
|
||||
"E9",
|
||||
"F",
|
||||
"FIX003",
|
||||
"FURB",
|
||||
"I",
|
||||
"INP",
|
||||
"ISC",
|
||||
"LOG",
|
||||
"PERF",
|
||||
"PIE",
|
||||
"PL",
|
||||
"PTH",
|
||||
"Q",
|
||||
"RSE",
|
||||
"SIM",
|
||||
"TCH",
|
||||
"UP",
|
||||
"A",
|
||||
"B",
|
||||
"C4",
|
||||
"DJ012",
|
||||
"E4",
|
||||
"E7",
|
||||
"E9",
|
||||
"F",
|
||||
"FIX003",
|
||||
"FURB",
|
||||
"I",
|
||||
"INP",
|
||||
"ISC",
|
||||
"LOG",
|
||||
"PERF",
|
||||
"PIE",
|
||||
"PL",
|
||||
"PTH",
|
||||
"Q",
|
||||
"RSE",
|
||||
"SIM",
|
||||
"TCH",
|
||||
"UP",
|
||||
]
|
||||
lint.ignore = [ "ISC001" ]
|
||||
lint.isort.known-first-party = [
|
||||
"cmsmanage",
|
||||
"dashboard",
|
||||
"doorcontrol",
|
||||
"membershipworks",
|
||||
"paperwork",
|
||||
"rentals",
|
||||
"reservations",
|
||||
"tasks",
|
||||
"cmsmanage",
|
||||
"dashboard",
|
||||
"doorcontrol",
|
||||
"membershipworks",
|
||||
"paperwork",
|
||||
"rentals",
|
||||
"reservations",
|
||||
"tasks",
|
||||
]
|
||||
lint.isort.section-order = [ "future", "standard-library", "django", "third-party", "first-party", "local-folder" ]
|
||||
lint.isort.sections."django" = [ "django" ]
|
||||
|
||||
[tool.pyproject-fmt]
|
||||
indent = 4
|
||||
|
||||
[tool.coverage.run]
|
||||
source = [
|
||||
"cmsmanage",
|
||||
"dashboard",
|
||||
"doorcontrol",
|
||||
"membershipworks",
|
||||
"paperwork",
|
||||
"rentals",
|
||||
"reservations",
|
||||
"cmsmanage",
|
||||
"dashboard",
|
||||
"doorcontrol",
|
||||
"membershipworks",
|
||||
"paperwork",
|
||||
"rentals",
|
||||
"reservations",
|
||||
]
|
||||
omit = [
|
||||
"*/migrations/*",
|
||||
"*/migrations/*",
|
||||
]
|
||||
|
||||
[tool.mypy]
|
||||
plugins = [
|
||||
"./cmsmanage/mypy_django_configurations_plugin.py",
|
||||
"mypy_django_plugin.main",
|
||||
"mypy_drf_plugin.main",
|
||||
"./cmsmanage/mypy_django_configurations_plugin.py",
|
||||
"mypy_django_plugin.main",
|
||||
"mypy_drf_plugin.main",
|
||||
]
|
||||
|
||||
[tool.djlint]
|
||||
|
Loading…
x
Reference in New Issue
Block a user