tina4-python 0.2.166__tar.gz → 0.2.168__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 (56) hide show
  1. {tina4_python-0.2.166 → tina4_python-0.2.168}/PKG-INFO +1 -1
  2. {tina4_python-0.2.166 → tina4_python-0.2.168}/pyproject.toml +1 -1
  3. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Template.py +5 -2
  4. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/js/tina4helper.js +49 -24
  5. {tina4_python-0.2.166 → tina4_python-0.2.168}/.gitignore +0 -0
  6. {tina4_python-0.2.166 → tina4_python-0.2.168}/README.md +0 -0
  7. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Api.py +0 -0
  8. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Auth.py +0 -0
  9. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/CRUD.py +0 -0
  10. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Constant.py +0 -0
  11. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Database.py +0 -0
  12. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/DatabaseResult.py +0 -0
  13. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/DatabaseTypes.py +0 -0
  14. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Debug.py +0 -0
  15. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Env.py +0 -0
  16. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/FieldTypes.py +0 -0
  17. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/HtmlElement.py +0 -0
  18. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Localization.py +0 -0
  19. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Messages.py +0 -0
  20. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/MiddleWare.py +0 -0
  21. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Migration.py +0 -0
  22. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/ORM.py +0 -0
  23. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Queue.py +0 -0
  24. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Request.py +0 -0
  25. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Response.py +0 -0
  26. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Router.py +0 -0
  27. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Session.py +0 -0
  28. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/ShellColors.py +0 -0
  29. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Swagger.py +0 -0
  30. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Testing.py +0 -0
  31. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/WSDL.py +0 -0
  32. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Webserver.py +0 -0
  33. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/Websocket.py +0 -0
  34. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/__init__.py +0 -0
  35. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/cli.py +0 -0
  36. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/messages.pot +0 -0
  37. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/css/readme.md +0 -0
  38. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/favicon.ico +0 -0
  39. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/images/403.png +0 -0
  40. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/images/404.png +0 -0
  41. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/images/500.png +0 -0
  42. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/images/logo.png +0 -0
  43. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/images/readme.md +0 -0
  44. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/js/readme.md +0 -0
  45. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/js/reconnecting-websocket.js +0 -0
  46. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/swagger/index.html +0 -0
  47. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
  48. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/templates/components/crud.twig +0 -0
  49. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/templates/errors/403.twig +0 -0
  50. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/templates/errors/404.twig +0 -0
  51. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/templates/errors/500.twig +0 -0
  52. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/templates/readme.md +0 -0
  53. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
  54. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
  55. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
  56. {tina4_python-0.2.166 → tina4_python-0.2.168}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tina4-python
3
- Version: 0.2.166
3
+ Version: 0.2.168
4
4
  Summary: Tina4Python - This is not another framework for Python
5
5
  Author-email: Andre van Zuydam <andrevanzuydam@gmail.com>
6
6
  Requires-Python: <4.0,>=3.12
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tina4-python"
3
- version = "0.2.166"
3
+ version = "0.2.168"
4
4
  description = "Tina4Python - This is not another framework for Python"
5
5
  authors = [
6
6
  {name = "Andre van Zuydam",email = "andrevanzuydam@gmail.com"}
@@ -60,8 +60,11 @@ class Template:
60
60
  @staticmethod
61
61
  def datetime_format(value, format="%H:%M %d-%m-%y"):
62
62
  if value.strip().upper() == "NOW":
63
- value = date.today()
64
- return value.strftime(format)
63
+ value = datetime.now()
64
+ try:
65
+ return value.strftime(format)
66
+ except AttributeError:
67
+ return value
65
68
 
66
69
  @staticmethod
67
70
  def production_dump(param):
@@ -7,46 +7,71 @@ var formToken = null;
7
7
  * @param method
8
8
  * @param callback
9
9
  */
10
- function sendRequest (url, request, method, callback) {
11
- if (url === undefined) {
12
- url = "";
13
- }
14
- if (request === undefined) {
15
- request = null;
16
- }
17
- if (method === undefined) {
18
- method = 'GET';
19
- }
10
+ function sendRequest(url, request, method, callback) {
11
+ // Default values
12
+ if (url === undefined) url = "";
13
+ if (request === undefined) request = null;
14
+ if (method === undefined) method = 'GET';
20
15
 
21
16
  const xhr = new XMLHttpRequest();
22
-
23
-
24
17
  xhr.open(method, url, true);
25
18
 
19
+ // Add authorization header if token exists
26
20
  if (formToken !== null) {
27
- //set a form token to the header
28
- xhr.setRequestHeader('Authorization', 'Bearer '+formToken);
21
+ xhr.setRequestHeader('Authorization', 'Bearer ' + formToken);
22
+ }
23
+
24
+ // ────────────────────────────────────────────────
25
+ // Content-Type logic – only set when appropriate
26
+ // ────────────────────────────────────────────────
27
+ let isFormData = request instanceof FormData;
28
+
29
+ if (method.toUpperCase() === 'POST' || method.toUpperCase() === 'PUT' || method.toUpperCase() === 'PATCH') {
30
+ if (isFormData) {
31
+ //DO not touch this
32
+ } else if (typeof request === 'object' && request !== null) {
33
+ //Becomes a JSON String
34
+ request = JSON.stringify(request);
35
+ xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
36
+ } else if (typeof request === 'string') {
37
+ // Already a string – assume JSON or let server decide
38
+ // You can set charset=UTF-8 if you're sure it's JSON/text
39
+ xhr.setRequestHeader('Content-Type', 'text/plain; charset=UTF-8');
40
+ }
29
41
  }
30
42
 
43
+ // ────────────────────────────────────────────────
44
+ // Response handling
45
+ // ────────────────────────────────────────────────
31
46
  xhr.onload = function () {
32
47
  let content = xhr.response;
33
- if (xhr.getResponseHeader('FreshToken') !== '' && xhr.getResponseHeader('FreshToken') !== null) {
34
- formToken = xhr.getResponseHeader('FreshToken');
48
+
49
+ // Update token if server sent a fresh one
50
+ const freshToken = xhr.getResponseHeader('FreshToken');
51
+ if (freshToken && freshToken !== '') {
52
+ formToken = freshToken;
35
53
  }
36
54
 
37
55
  try {
38
56
  content = JSON.parse(content);
39
- callback(content);
40
- } catch (exception) {
41
- callback (content);
57
+ } catch (e) {
58
+ // Not JSON → keep as raw string/text
59
+ }
60
+
61
+ if (typeof callback === 'function') {
62
+ callback(content, xhr.status, xhr);
42
63
  }
43
64
  };
44
65
 
45
- if (method === 'POST') {
46
- xhr.send(request);
47
- } else {
48
- xhr.send(null);
49
- }
66
+ // Optional: handle errors
67
+ xhr.onerror = function () {
68
+ if (typeof callback === 'function') {
69
+ callback(null, xhr.status, xhr);
70
+ }
71
+ };
72
+
73
+ // Send the body (or null)
74
+ xhr.send(request);
50
75
  }
51
76
 
52
77
  /**
File without changes