kopia lustrzana https://github.com/jedie/PyInventory
Release as v0.19.0
rodzic
f1c10f1d4a
commit
7da60dfe8a
|
@ -154,11 +154,12 @@ Files are separated into: "/src/" and "/development/"
|
||||||
## history
|
## history
|
||||||
|
|
||||||
|
|
||||||
* [**dev**](https://github.com/jedie/PyInventory/compare/v0.18.1...main)
|
* [**dev**](https://github.com/jedie/PyInventory/compare/v0.19.0...main)
|
||||||
|
* tbc
|
||||||
|
* [v0.19.0 - 15.06.2023](https://github.com/jedie/PyInventory/compare/v0.18.1...v0.19.0)
|
||||||
* Update to Django 4.2
|
* Update to Django 4.2
|
||||||
* remove django-processinfo
|
* remove django-processinfo
|
||||||
* Bugfix ItemModelAdmin
|
* Bugfix ItemModelAdmin
|
||||||
* tbc
|
|
||||||
* [v0.18.1 - 15.06.2023](https://github.com/jedie/PyInventory/compare/v0.18.0...v0.18.1)
|
* [v0.18.1 - 15.06.2023](https://github.com/jedie/PyInventory/compare/v0.18.0...v0.18.1)
|
||||||
* Update requirements
|
* Update requirements
|
||||||
* [v0.18.0 - 04.04.2023](https://github.com/jedie/PyInventory/compare/v0.17.0...v0.18.0)
|
* [v0.18.0 - 04.04.2023](https://github.com/jedie/PyInventory/compare/v0.17.0...v0.18.0)
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
export PROJECT_NAME=pyinventory
|
export PROJECT_NAME=pyinventory
|
||||||
export PROJECT_PACKAGE_NAME=pyinventory
|
export PROJECT_PACKAGE_NAME=pyinventory
|
||||||
export PROJECT_VERSION=0.18.1
|
export PROJECT_VERSION=0.19.0
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "PyInventory"
|
name = "PyInventory"
|
||||||
version = "0.18.1"
|
version = "0.19.0"
|
||||||
description = "Web based management to catalog things including state and location etc. using Python/Django."
|
description = "Web based management to catalog things including state and location etc. using Python/Django."
|
||||||
authors = [
|
authors = [
|
||||||
"Jens Diemer <PyInventory@jensdiemer.de>",
|
"Jens Diemer <PyInventory@jensdiemer.de>",
|
||||||
|
|
|
@ -4,8 +4,8 @@ from bx_django_utils.test_utils.html_assertion import HtmlAssertionMixin, assert
|
||||||
from django.template.defaulttags import CsrfTokenNode, NowNode
|
from django.template.defaulttags import CsrfTokenNode, NowNode
|
||||||
from django.test import TestCase, override_settings
|
from django.test import TestCase, override_settings
|
||||||
|
|
||||||
from inventory import __version__
|
|
||||||
from inventory_project.tests.fixtures import get_normal_user
|
from inventory_project.tests.fixtures import get_normal_user
|
||||||
|
from inventory_project.tests.mocks import MockInventoryVersionString
|
||||||
|
|
||||||
|
|
||||||
@override_settings(SECURE_SSL_REDIRECT=False)
|
@override_settings(SECURE_SSL_REDIRECT=False)
|
||||||
|
@ -18,7 +18,7 @@ class AdminTestCase(HtmlAssertionMixin, TestCase):
|
||||||
self.client.force_login(self.normaluser)
|
self.client.force_login(self.normaluser)
|
||||||
with mock.patch.object(NowNode, 'render', return_value='MockedNowNode'), mock.patch.object(
|
with mock.patch.object(NowNode, 'render', return_value='MockedNowNode'), mock.patch.object(
|
||||||
CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'
|
CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'
|
||||||
):
|
), MockInventoryVersionString():
|
||||||
response = self.client.get(
|
response = self.client.get(
|
||||||
path='/admin/inventory/locationmodel/',
|
path='/admin/inventory/locationmodel/',
|
||||||
)
|
)
|
||||||
|
@ -26,7 +26,7 @@ class AdminTestCase(HtmlAssertionMixin, TestCase):
|
||||||
self.assert_html_parts(
|
self.assert_html_parts(
|
||||||
response,
|
response,
|
||||||
parts=(
|
parts=(
|
||||||
f'<title>Select Location to change | PyInventory v{__version__}</title>',
|
'<title>Select Location to change | PyInventory vMockedVersionString</title>',
|
||||||
'<a href="/admin/inventory/locationmodel/add/" class="addlink">Add Location</a>',
|
'<a href="/admin/inventory/locationmodel/add/" class="addlink">Add Location</a>',
|
||||||
'<p class="paginator">0 Locations</p>',
|
'<p class="paginator">0 Locations</p>',
|
||||||
),
|
),
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
|
from bx_py_utils.test_utils.context_managers import MassContextManager
|
||||||
|
|
||||||
|
from inventory import context_processors
|
||||||
|
|
||||||
|
|
||||||
|
class MockInventoryVersionString(MassContextManager):
|
||||||
|
def __init__(self):
|
||||||
|
self.mocks = [
|
||||||
|
mock.patch.object(context_processors, '__version__', self),
|
||||||
|
]
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return 'MockedVersionString'
|
|
@ -10,16 +10,15 @@ from django.utils import timezone
|
||||||
from django_tools.unittest_utils.mockup import ImageDummy
|
from django_tools.unittest_utils.mockup import ImageDummy
|
||||||
from reversion.models import Revision
|
from reversion.models import Revision
|
||||||
|
|
||||||
from inventory import __version__
|
|
||||||
from inventory.models import ItemImageModel, ItemModel
|
from inventory.models import ItemImageModel, ItemModel
|
||||||
from inventory_project.tests.fixtures import get_normal_user
|
from inventory_project.tests.fixtures import get_normal_user
|
||||||
|
from inventory_project.tests.mocks import MockInventoryVersionString
|
||||||
|
|
||||||
|
|
||||||
ITEM_FORM_DEFAULTS = {
|
ITEM_FORM_DEFAULTS = {
|
||||||
'version': 0, # VersionProtectBaseModel field
|
'version': 0, # VersionProtectBaseModel field
|
||||||
'kind': 'kind',
|
'kind': 'kind',
|
||||||
'name': 'name',
|
'name': 'name',
|
||||||
|
|
||||||
'itemimagemodel_set-TOTAL_FORMS': '0',
|
'itemimagemodel_set-TOTAL_FORMS': '0',
|
||||||
'itemimagemodel_set-INITIAL_FORMS': '0',
|
'itemimagemodel_set-INITIAL_FORMS': '0',
|
||||||
'itemimagemodel_set-MIN_NUM_FORMS': '0',
|
'itemimagemodel_set-MIN_NUM_FORMS': '0',
|
||||||
|
@ -55,27 +54,22 @@ class AdminAnonymousTests(HtmlAssertionMixin, TestCase):
|
||||||
fetch_redirect_response=False
|
fetch_redirect_response=False
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self.client.get(
|
response = self.client.get(path='/admin/inventory/itemmodel/add/', secure=True, HTTP_ACCEPT_LANGUAGE='en')
|
||||||
path='/admin/inventory/itemmodel/add/',
|
|
||||||
secure=True,
|
|
||||||
HTTP_ACCEPT_LANGUAGE='en'
|
|
||||||
)
|
|
||||||
self.assertRedirects(
|
self.assertRedirects(
|
||||||
response,
|
response, expected_url='/admin/login/?next=/admin/inventory/itemmodel/add/', fetch_redirect_response=False
|
||||||
expected_url='/admin/login/?next=/admin/inventory/itemmodel/add/',
|
|
||||||
fetch_redirect_response=False
|
|
||||||
)
|
)
|
||||||
with mock.patch.object(CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'):
|
with mock.patch.object(
|
||||||
response = self.client.get(
|
CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'
|
||||||
path='/admin/login/',
|
), MockInventoryVersionString():
|
||||||
secure=True,
|
response = self.client.get(path='/admin/login/', secure=True, HTTP_ACCEPT_LANGUAGE='en')
|
||||||
HTTP_ACCEPT_LANGUAGE='en'
|
self.assert_html_parts(
|
||||||
|
response,
|
||||||
|
parts=(
|
||||||
|
'<title>Log in | PyInventory vMockedVersionString</title>',
|
||||||
|
'<label class="required" for="id_username">Username:</label>',
|
||||||
|
'<label class="required" for="id_password">Password:</label>',
|
||||||
|
),
|
||||||
)
|
)
|
||||||
self.assert_html_parts(response, parts=(
|
|
||||||
f'<title>Log in | PyInventory v{__version__}</title>',
|
|
||||||
'<label class="required" for="id_username">Username:</label>',
|
|
||||||
'<label class="required" for="id_password">Password:</label>',
|
|
||||||
))
|
|
||||||
assert_html_response_snapshot(response, validate=False)
|
assert_html_response_snapshot(response, validate=False)
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,16 +81,16 @@ class AdminTestCase(HtmlAssertionMixin, TestCase):
|
||||||
|
|
||||||
def test_normal_user_create_minimal_item(self):
|
def test_normal_user_create_minimal_item(self):
|
||||||
offset = datetime.timedelta(minutes=1)
|
offset = datetime.timedelta(minutes=1)
|
||||||
with mock.patch.object(timezone, 'now', MockDatetimeGenerator(offset=offset)),\
|
with mock.patch.object(timezone, 'now', MockDatetimeGenerator(offset=offset)), mock.patch.object(
|
||||||
mock.patch.object(NowNode, 'render', return_value='MockedNowNode'), \
|
NowNode, 'render', return_value='MockedNowNode'
|
||||||
mock.patch.object(CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'):
|
), mock.patch.object(
|
||||||
|
CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'
|
||||||
|
), MockInventoryVersionString():
|
||||||
self.client.force_login(self.normaluser)
|
self.client.force_login(self.normaluser)
|
||||||
|
|
||||||
response = self.client.get('/admin/inventory/itemmodel/add/')
|
response = self.client.get('/admin/inventory/itemmodel/add/')
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
self.assert_html_parts(response, parts=(
|
self.assert_html_parts(response, parts=('<title>Add Item | PyInventory vMockedVersionString</title>',))
|
||||||
f'<title>Add Item | PyInventory v{__version__}</title>',
|
|
||||||
))
|
|
||||||
assert_html_response_snapshot(response=response, validate=False)
|
assert_html_response_snapshot(response=response, validate=False)
|
||||||
|
|
||||||
assert ItemModel.objects.count() == 0
|
assert ItemModel.objects.count() == 0
|
||||||
|
@ -133,11 +127,14 @@ class AdminTestCase(HtmlAssertionMixin, TestCase):
|
||||||
path=f'/admin/inventory/itemmodel/{item.pk}/change/',
|
path=f'/admin/inventory/itemmodel/{item.pk}/change/',
|
||||||
data=post_data,
|
data=post_data,
|
||||||
)
|
)
|
||||||
self.assert_html_parts(response, parts=(
|
self.assert_html_parts(
|
||||||
f'<title>Change Item | PyInventory v{__version__}</title>',
|
response,
|
||||||
'<li>Version error: Overwrite version 2 with 1 is forbidden!</li>',
|
parts=(
|
||||||
'<pre>- "name"\n+ "A new Name!"</pre>'
|
'<title>Change Item | PyInventory vMockedVersionString</title>',
|
||||||
))
|
'<li>Version error: Overwrite version 2 with 1 is forbidden!</li>',
|
||||||
|
'<pre>- "name"\n+ "A new Name!"</pre>',
|
||||||
|
),
|
||||||
|
)
|
||||||
html = response.content.decode('utf-8')
|
html = response.content.decode('utf-8')
|
||||||
html = html.replace(str(item.pk), '<removed-UUID>')
|
html = html.replace(str(item.pk), '<removed-UUID>')
|
||||||
assert_html_snapshot(got=html, validate=False)
|
assert_html_snapshot(got=html, validate=False)
|
||||||
|
@ -217,7 +214,7 @@ class AdminTestCase(HtmlAssertionMixin, TestCase):
|
||||||
|
|
||||||
with mock.patch.object(NowNode, 'render', return_value='MockedNowNode'), mock.patch.object(
|
with mock.patch.object(NowNode, 'render', return_value='MockedNowNode'), mock.patch.object(
|
||||||
CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'
|
CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'
|
||||||
):
|
), MockInventoryVersionString():
|
||||||
response = self.client.get(
|
response = self.client.get(
|
||||||
path='/admin/inventory/itemmodel/',
|
path='/admin/inventory/itemmodel/',
|
||||||
)
|
)
|
||||||
|
@ -225,7 +222,7 @@ class AdminTestCase(HtmlAssertionMixin, TestCase):
|
||||||
self.assert_html_parts(
|
self.assert_html_parts(
|
||||||
response,
|
response,
|
||||||
parts=(
|
parts=(
|
||||||
f'<title>Select Item to change | PyInventory v{__version__}</title>',
|
'<title>Select Item to change | PyInventory vMockedVersionString</title>',
|
||||||
'<a href="/admin/inventory/itemmodel/00000000-0001-0000-0000-000000000000/change/">'
|
'<a href="/admin/inventory/itemmodel/00000000-0001-0000-0000-000000000000/change/">'
|
||||||
'<strong>main item 1</strong></a>',
|
'<strong>main item 1</strong></a>',
|
||||||
'<a href="/admin/inventory/itemmodel/00000000-0001-0001-0000-000000000000/change/">'
|
'<a href="/admin/inventory/itemmodel/00000000-0001-0001-0000-000000000000/change/">'
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<html dir="ltr" lang="en">
|
<html dir="ltr" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<title>
|
<title>
|
||||||
Change Item | PyInventory v0.18.1
|
Change Item | PyInventory vMockedVersionString
|
||||||
</title>
|
</title>
|
||||||
<link href="/static/admin/css/base.css" rel="stylesheet"/>
|
<link href="/static/admin/css/base.css" rel="stylesheet"/>
|
||||||
<link href="/static/admin/css/dark_mode.css" rel="stylesheet"/>
|
<link href="/static/admin/css/dark_mode.css" rel="stylesheet"/>
|
||||||
|
@ -77,7 +77,7 @@
|
||||||
<div id="branding">
|
<div id="branding">
|
||||||
<h1 id="site-name">
|
<h1 id="site-name">
|
||||||
<a href="/admin/">
|
<a href="/admin/">
|
||||||
PyInventory v0.18.1
|
PyInventory vMockedVersionString
|
||||||
</a>
|
</a>
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,9 +8,9 @@ from django_tools.unittest_utils.mockup import ImageDummy
|
||||||
from model_bakery import baker
|
from model_bakery import baker
|
||||||
from reversion.models import Revision
|
from reversion.models import Revision
|
||||||
|
|
||||||
from inventory import __version__
|
|
||||||
from inventory.models import MemoImageModel, MemoModel
|
from inventory.models import MemoImageModel, MemoModel
|
||||||
from inventory.permissions import get_or_create_normal_user_group
|
from inventory.permissions import get_or_create_normal_user_group
|
||||||
|
from inventory_project.tests.mocks import MockInventoryVersionString
|
||||||
|
|
||||||
|
|
||||||
class AdminAnonymousTests(TestCase):
|
class AdminAnonymousTests(TestCase):
|
||||||
|
@ -42,13 +42,12 @@ class AdminTestCase(HtmlAssertionMixin, TestCase):
|
||||||
def test_normal_user_create_minimal_item(self):
|
def test_normal_user_create_minimal_item(self):
|
||||||
self.client.force_login(self.normaluser)
|
self.client.force_login(self.normaluser)
|
||||||
|
|
||||||
with mock.patch.object(NowNode, 'render', return_value='MockedNowNode'), \
|
with mock.patch.object(NowNode, 'render', return_value='MockedNowNode'), mock.patch.object(
|
||||||
mock.patch.object(CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'):
|
CsrfTokenNode, 'render', return_value='MockedCsrfTokenNode'
|
||||||
|
), MockInventoryVersionString():
|
||||||
response = self.client.get('/admin/inventory/memomodel/add/')
|
response = self.client.get('/admin/inventory/memomodel/add/')
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
self.assert_html_parts(response, parts=(
|
self.assert_html_parts(response, parts=('<title>Add Memo | PyInventory vMockedVersionString</title>',))
|
||||||
f'<title>Add Memo | PyInventory v{__version__}</title>',
|
|
||||||
))
|
|
||||||
assert_html_response_snapshot(response=response, validate=False)
|
assert_html_response_snapshot(response=response, validate=False)
|
||||||
|
|
||||||
assert MemoModel.objects.count() == 0
|
assert MemoModel.objects.count() == 0
|
||||||
|
|
Ładowanie…
Reference in New Issue