diff --git a/InvenTree/InvenTree/tasks.py b/InvenTree/InvenTree/tasks.py index e34c7e8c21..61b6885b03 100644 --- a/InvenTree/InvenTree/tasks.py +++ b/InvenTree/InvenTree/tasks.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import re import json import requests import logging @@ -35,7 +36,7 @@ def schedule_task(taskname, **kwargs): **kwargs ) - + def delete_successful_tasks(): """ Delete successful task logs @@ -49,6 +50,12 @@ def check_for_updates(): Check if there is an update for InvenTree """ + try: + import common.models + import InvenTree.version + except AppRegistryNotReady: + return + response = requests.get('https://api.github.com/repos/inventree/inventree/releases/latest') if not response.status_code == 200: @@ -57,12 +64,33 @@ def check_for_updates(): data = json.loads(response.text) - print("Response:") - print(data) - # TODO + tag = data.get('tag_name', None) - return data + if not tag: + logger.warning(f"'tag_name' missing from GitHub response") + return + match = re.match(r"^.*(\d+)\.(\d+)\.(\d+).*$", tag) -def test(x): - print(f"Running at task! {x}") \ No newline at end of file + if not len(match.groups()) == 3: + logger.warning(f"Version '{tag}' did not match expected pattern") + return + + try: + latest_version = [int(x) for x in match.groups()] + except (ValueError): + logger.warning(f"Version '{tag}' not integer format") + return + + if not len(latest_version) == 3: + logger.warning(f"Version '{tag}' is not correct format") + return + + logger.info(f"Latest InvenTree version: '{tag}'") + + # Save the version to the database + common.models.InvenTreeSetting.set_setting( + 'INVENTREE_LATEST_VERSION', + tag, + None + ) diff --git a/InvenTree/InvenTree/tests.py b/InvenTree/InvenTree/tests.py index 96f32e7f57..1cb382e338 100644 --- a/InvenTree/InvenTree/tests.py +++ b/InvenTree/InvenTree/tests.py @@ -7,6 +7,7 @@ from django.core.exceptions import ValidationError from .validators import validate_overage, validate_part_name from . import helpers +from . import version from mptt.exceptions import InvalidMove @@ -269,3 +270,15 @@ class TestSerialNumberExtraction(TestCase): with self.assertRaises(ValidationError): e("10, a, 7-70j", 4) + + +class TestVersionNumber(TestCase): + + def test_tuple(self): + + v = version.inventreeVersionTuple() + self.assertEqual(len(v), 3) + + s = '.'.join(v) + + self.assertTrue(s in version.inventreeVersion()) diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index 4d3d546789..6aa5c2616c 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -4,9 +4,11 @@ Provides information on the current InvenTree version import subprocess import django +import re import common.models + INVENTREE_SW_VERSION = "0.1.8 pre" # Increment this number whenever there is a significant change to the API that any clients need to know about @@ -23,6 +25,27 @@ def inventreeVersion(): return INVENTREE_SW_VERSION +def inventreeVersionTuple(): + """ Return the InvenTree version string as (maj, min, sub) tuple """ + + match = re.match(r"^.*(\d+)\.(\d+)\.(\d+).*$", INVENTREE_SW_VERSION) + + return [int(g) for g in match.groups()] + + +def versionTupleToInt(version): + """ + Convert a version tuple (x, y, z) to an integer. + This simple integer can then be used for direct version comparison + """ + + n = version[0] * 1000 * 1000 + n += version[1] * 1000 + n += version[2] + + return n + + def inventreeApiVersion(): return INVENTREE_API_VERSION diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 06c06bde05..23e0773605 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -486,7 +486,7 @@ class InvenTreeSetting(models.Model): create: If True, create a new setting if the specified key does not exist. """ - if not user.is_staff: + if user is not None and not user.is_staff: return try: