From e275e2e240aa69c4557abab29c04cfe7036cf4d0 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 31 Jan 2020 11:11:24 +0100 Subject: [PATCH] API: Add endpoint to expose pretix version --- src/pretix/api/urls.py | 5 +-- src/pretix/api/views/version.py | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/pretix/api/views/version.py diff --git a/src/pretix/api/urls.py b/src/pretix/api/urls.py index 2ea1dcd018..36ec254852 100644 --- a/src/pretix/api/urls.py +++ b/src/pretix/api/urls.py @@ -7,8 +7,8 @@ from rest_framework import routers from pretix.api.views import cart from .views import ( - checkin, device, event, item, oauth, order, organizer, user, voucher, - waitinglist, webhooks, + checkin, device, event, item, oauth, order, organizer, user, version, + voucher, waitinglist, webhooks, ) router = routers.DefaultRouter() @@ -83,4 +83,5 @@ urlpatterns = [ url(r"^device/roll$", device.RollKeyView.as_view(), name="device.roll"), url(r"^device/revoke$", device.RevokeKeyView.as_view(), name="device.revoke"), url(r"^me$", user.MeView.as_view(), name="user.me"), + url(r"^version$", version.VersionView.as_view(), name="version"), ] diff --git a/src/pretix/api/views/version.py b/src/pretix/api/views/version.py new file mode 100644 index 0000000000..4ec275397d --- /dev/null +++ b/src/pretix/api/views/version.py @@ -0,0 +1,56 @@ +from oauth2_provider.contrib.rest_framework import OAuth2Authentication +from packaging import version +from rest_framework.authentication import SessionAuthentication +from rest_framework.response import Response +from rest_framework.views import APIView + +from pretix import __version__ +from pretix.api.auth.device import DeviceTokenAuthentication +from pretix.api.auth.token import TeamTokenAuthentication + + +def numeric_version(v): + # Converts a pretix version to a large int + # e.g. 30060001000 + # |--------------------- Major version + # |-|------------------ Minor version + # |-|--------------- Patch version + # ||------------- Stage (10 dev, 20 alpha, 30 beta, 40 rc, 50 release, 60 post) + # ||----------- Stage version (number of dev/alpha/beta/rc/post release) + v = version.parse(v) + phases = { + 'dev': 10, + 'a': 20, + 'b': 30, + 'rc': 40, + 'release': 50, + 'post': 60 + } + vnum = 0 + + if v.is_postrelease: + vnum += v.post + vnum += phases['post'] * 100 + elif v.dev is not None: + vnum += v.dev + vnum += phases['dev'] * 100 + elif v.is_prerelease and v.pre: + vnum += v.pre[0] + vnum += phases[v.pre[1]] * 100 + else: + vnum += phases['release'] * 100 + for i, part in enumerate(reversed(v.release)): + vnum += part * (1000 ** i) * 10000 + return vnum + + +class VersionView(APIView): + authentication_classes = ( + SessionAuthentication, OAuth2Authentication, DeviceTokenAuthentication, TeamTokenAuthentication + ) + + def get(self, request, format=None): + return Response({ + 'pretix': __version__, + 'pretix_numeric': numeric_version(__version__), + })