django-botmanager 0.1.14__tar.gz → 0.2.15__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 (33) hide show
  1. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/PKG-INFO +1 -1
  2. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/admin.py +3 -2
  3. django-botmanager-0.2.15/botmanager/migrations/0011_alter_task_create_dt_alter_task_id.py +24 -0
  4. django-botmanager-0.2.15/botmanager/models.py +71 -0
  5. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/settings.py +46 -38
  6. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/django_botmanager.egg-info/PKG-INFO +1 -1
  7. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/django_botmanager.egg-info/SOURCES.txt +2 -0
  8. django-botmanager-0.2.15/django_botmanager.egg-info/pbr.json +1 -0
  9. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/django_botmanager.egg-info/requires.txt +1 -1
  10. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/setup.py +2 -2
  11. django-botmanager-0.1.14/botmanager/models.py +0 -71
  12. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/README.md +0 -0
  13. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/__init__.py +0 -0
  14. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/apps.py +0 -0
  15. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/basetask.py +0 -0
  16. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/management/__init__.py +0 -0
  17. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/management/commands/__init__.py +0 -0
  18. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/management/commands/bot_manager.py +0 -0
  19. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0001_initial.py +0 -0
  20. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0002_auto_20161208_1406.py +0 -0
  21. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0003_auto_20161208_1529.py +0 -0
  22. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0004_auto_20161219_1931.py +0 -0
  23. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0005_task_parent.py +0 -0
  24. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0006_task_priority.py +0 -0
  25. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0007_task_is_persistent.py +0 -0
  26. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0008_auto_20170331_1752.py +0 -0
  27. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0009_task_extra_params.py +0 -0
  28. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/0010_auto_20170531_1321.py +0 -0
  29. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/migrations/__init__.py +0 -0
  30. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/botmanager/utils.py +0 -0
  31. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/django_botmanager.egg-info/dependency_links.txt +0 -0
  32. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/django_botmanager.egg-info/top_level.txt +0 -0
  33. {django-botmanager-0.1.14 → django-botmanager-0.2.15}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: django-botmanager
3
- Version: 0.1.14
3
+ Version: 0.2.15
4
4
  Summary: Async tasks for django
5
5
  Home-page: https://github.com/dimoha/django-botmanager
6
6
  Author: Dimoha
@@ -1,6 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  from django.contrib import admin
3
3
  from django.utils.html import escape
4
+ from django.utils.translation import gettext_lazy as _
4
5
  from botmanager.models import Task
5
6
 
6
7
 
@@ -28,12 +29,12 @@ class TaskAdmin(admin.ModelAdmin):
28
29
  else:
29
30
  return None
30
31
 
31
- error_field.short_description = u"Ошибка"
32
+ error_field.short_description = _("Ошибка")
32
33
  error_field.allow_tags = True
33
34
 
34
35
  def input_field(self, obj):
35
36
  return obj.input
36
37
 
37
- input_field.short_description = "Вводные данные"
38
+ input_field.short_description = _("Вводные данные")
38
39
 
39
40
  admin.site.register(Task, TaskAdmin)
@@ -0,0 +1,24 @@
1
+ # Generated by Django 4.1.2 on 2023-06-28 11:19
2
+
3
+ from django.db import migrations, models
4
+ import django.utils.timezone
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('botmanager', '0010_auto_20170531_1321'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='task',
16
+ name='create_dt',
17
+ field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Дата создания задачи'),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name='task',
21
+ name='id',
22
+ field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
23
+ ),
24
+ ]
@@ -0,0 +1,71 @@
1
+ # -*- coding: utf-8 -*-
2
+ from __future__ import unicode_literals
3
+ from django.db import models
4
+ from jsonfield import JSONField
5
+ from datetime import timedelta, datetime
6
+ from django.utils import timezone
7
+ from django.utils.translation import gettext_lazy as _
8
+
9
+ class Task(models.Model):
10
+
11
+ STATUS_NEW = 'NEW'
12
+ STATUS_IN_PROCESS = 'IN_PROCESS'
13
+ STATUS_OK = 'OK'
14
+
15
+ STATUSES = (
16
+ (STATUS_NEW, u'В ожидании'),
17
+ (STATUS_IN_PROCESS, u'Идет загрузка'),
18
+ (STATUS_OK, u'Данные загружены'),
19
+ )
20
+
21
+ name = models.CharField(max_length=256, verbose_name=_(u'Название'))
22
+ create_dt = models.DateTimeField(verbose_name=_(u"Дата создания задачи"), default=timezone.now)
23
+ finish_dt = models.DateTimeField(verbose_name=_(u"Дата завершения"), null=True, blank=True)
24
+ is_complete = models.BooleanField(verbose_name=_(u"Выполнена"), default=False)
25
+ is_failed = models.BooleanField(verbose_name=_(u"Аварийное завершение"), default=False)
26
+ is_persistent = models.BooleanField(verbose_name=_(u"Выполнять пока не завершится успешно"), default=True)
27
+ in_process = models.BooleanField(verbose_name=_(u"В процессе"), default=False)
28
+
29
+ input = JSONField(null=True, blank=True)
30
+ output = JSONField(null=True, blank=True)
31
+ last_error = JSONField(null=True, blank=True)
32
+ extra_params = JSONField(null=True, blank=True)
33
+
34
+ last_error_dt = models.DateTimeField(verbose_name=_(u"Дата последнего fail-а"), null=True, blank=True)
35
+ queue_key = models.CharField(max_length=32, verbose_name=_(u'Ключ группировки задач'))
36
+ failed_action = models.CharField(max_length=256, verbose_name=_(u'Action, на котором произошла ошибка'), null=True, blank=True)
37
+ attempt_count = models.SmallIntegerField(verbose_name=_(u'Счетчик попыток'), default=0)
38
+ last_attempt_dt = models.DateTimeField(verbose_name=_(u"Последняя попытка выполнения"), null=True, blank=True)
39
+ max_attempt_count = models.IntegerField(
40
+ verbose_name=_(u"Максимальное кол-во попыток выполнение (если None, то бесконечно)"), null=True, blank=True
41
+ )
42
+ attempt_period = models.DurationField(verbose_name=_(u'Период между попытками'), default=timedelta(hours=1))
43
+ parent = models.ForeignKey('self', verbose_name=_(u'Родительская задача'), null=True, blank=True, related_name='child_tasks', on_delete=models.CASCADE)
44
+ priority = models.SmallIntegerField(default=0)
45
+
46
+ def __unicode__(self):
47
+ return "Task {0} #{1}".format(self.name, self.id)
48
+
49
+ @property
50
+ def can_execute(self):
51
+ if not self.is_complete and not self.in_process:
52
+ if self.is_failed:
53
+ if self.last_attempt_dt + self.attempt_period > timezone.now():
54
+ return False
55
+ else:
56
+ if self.max_attempt_count is None:
57
+ return True
58
+ else:
59
+ if self.attempt_count < self.max_attempt_count:
60
+ return True
61
+ else:
62
+ return False # надо пофиксить is_complete ?
63
+ else:
64
+ return True
65
+ else:
66
+ return False
67
+
68
+ class Meta:
69
+ db_table = 'botmanager_task'
70
+ verbose_name = _(u"Задача для BotManager")
71
+ verbose_name_plural = _(u"Задачи для BotManager")
@@ -16,24 +16,64 @@ if 'tasks' not in MAIN_CONFIG:
16
16
  if 'task_logs_separated' not in MAIN_CONFIG['logs']:
17
17
  MAIN_CONFIG['logs']['task_logs_separated'] = False
18
18
  if MAIN_CONFIG['logs']['task_logs_separated'] and 'logs_life_hours' not in MAIN_CONFIG['logs']:
19
- MAIN_CONFIG['logs']['logs_life_hours'] = 7*24
19
+ MAIN_CONFIG['logs']['logs_life_hours'] = 7 * 24
20
20
  if 'success_tasks_life_hours' not in MAIN_CONFIG['logs']:
21
- MAIN_CONFIG['logs']['success_tasks_life_hours'] = 7*24
21
+ MAIN_CONFIG['logs']['success_tasks_life_hours'] = 7 * 24
22
22
 
23
23
  DEFAULT_LOG_LEVEL = 'INFO'
24
24
 
25
25
  if 'dir' in MAIN_CONFIG['logs'] and MAIN_CONFIG['logs']['dir'] is not None:
26
26
 
27
27
  log_conf = MAIN_CONFIG['logs']
28
- max_bytes = log_conf['maxBytes'] if 'maxBytes' in log_conf and log_conf['maxBytes'] else 1024*1024*100
28
+ max_bytes = log_conf['maxBytes'] if 'maxBytes' in log_conf and log_conf['maxBytes'] else 1024 * 1024 * 100
29
29
  backupCount = log_conf['backupCount'] if 'backupCount' in log_conf and log_conf['backupCount'] else 10
30
30
  level = log_conf['level'] if 'level' in log_conf and log_conf['level'] else DEFAULT_LOG_LEVEL
31
31
  sentry_enabled = log_conf.get('sentry_enabled', False)
32
32
 
33
33
  handlers = ['console', 'common_errors', 'common']
34
34
 
35
+ handlers_config = {
36
+ 'mail_admins': {
37
+ 'level': 'ERROR',
38
+ 'class': 'django.utils.log.AdminEmailHandler',
39
+ },
40
+ 'console': {
41
+ 'level': level,
42
+ 'class': 'logging.StreamHandler',
43
+ 'formatter': 'default',
44
+ 'stream': sys.stdout
45
+ },
46
+ 'common_errors': {
47
+ 'level': 'ERROR',
48
+ 'class': 'logging.handlers.RotatingFileHandler',
49
+ 'filename': os.path.join(log_conf['dir'], 'botmanager_errors.log'),
50
+ 'maxBytes': max_bytes,
51
+ 'formatter': 'default',
52
+ 'encoding': 'utf-8',
53
+ 'backupCount': backupCount,
54
+ },
55
+ 'common': {
56
+ 'level': level,
57
+ 'class': 'logging.handlers.RotatingFileHandler',
58
+ 'filename': os.path.join(log_conf['dir'], 'botmanager.log'),
59
+ 'maxBytes': max_bytes,
60
+ 'formatter': 'default',
61
+ 'encoding': 'utf-8',
62
+ 'backupCount': backupCount,
63
+ }
64
+ }
65
+
35
66
  if sentry_enabled:
36
- handlers.append('sentry')
67
+ try:
68
+ import raven
69
+
70
+ handlers.append('sentry')
71
+ handlers_config['sentry'] = {
72
+ 'level': 'ERROR',
73
+ 'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
74
+ }
75
+ except ImportError:
76
+ raise ImportError('module "raven" not installed')
37
77
 
38
78
  if 'mail_admins' in log_conf and log_conf['mail_admins']:
39
79
  handlers.append('mail_admins')
@@ -46,40 +86,7 @@ if 'dir' in MAIN_CONFIG['logs'] and MAIN_CONFIG['logs']['dir'] is not None:
46
86
  'format': '%(asctime)s - %(processName)s - %(levelname)s - %(message)s'
47
87
  }
48
88
  },
49
- 'handlers': {
50
- 'sentry': {
51
- 'level': 'ERROR',
52
- 'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
53
- },
54
- 'mail_admins': {
55
- 'level': 'ERROR',
56
- 'class': 'django.utils.log.AdminEmailHandler',
57
- },
58
- 'console': {
59
- 'level': level,
60
- 'class': 'logging.StreamHandler',
61
- 'formatter': 'default',
62
- 'stream': sys.stdout
63
- },
64
- 'common_errors': {
65
- 'level': 'ERROR',
66
- 'class': 'logging.handlers.RotatingFileHandler',
67
- 'filename': os.path.join(log_conf['dir'], 'botmanager_errors.log'),
68
- 'maxBytes': max_bytes,
69
- 'formatter': 'default',
70
- 'encoding': 'utf-8',
71
- 'backupCount': backupCount,
72
- },
73
- 'common': {
74
- 'level': level,
75
- 'class': 'logging.handlers.RotatingFileHandler',
76
- 'filename': os.path.join(log_conf['dir'], 'botmanager.log'),
77
- 'maxBytes': max_bytes,
78
- 'formatter': 'default',
79
- 'encoding': 'utf-8',
80
- 'backupCount': backupCount,
81
- }
82
- },
89
+ 'handlers': handlers_config,
83
90
  'loggers': {
84
91
  'default': {
85
92
  'handlers': handlers,
@@ -88,5 +95,6 @@ if 'dir' in MAIN_CONFIG['logs'] and MAIN_CONFIG['logs']['dir'] is not None:
88
95
  },
89
96
  }
90
97
  }
98
+
91
99
  else:
92
100
  TASKS_LOGGING = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: django-botmanager
3
- Version: 0.1.14
3
+ Version: 0.2.15
4
4
  Summary: Async tasks for django
5
5
  Home-page: https://github.com/dimoha/django-botmanager
6
6
  Author: Dimoha
@@ -20,9 +20,11 @@ botmanager/migrations/0007_task_is_persistent.py
20
20
  botmanager/migrations/0008_auto_20170331_1752.py
21
21
  botmanager/migrations/0009_task_extra_params.py
22
22
  botmanager/migrations/0010_auto_20170531_1321.py
23
+ botmanager/migrations/0011_alter_task_create_dt_alter_task_id.py
23
24
  botmanager/migrations/__init__.py
24
25
  django_botmanager.egg-info/PKG-INFO
25
26
  django_botmanager.egg-info/SOURCES.txt
26
27
  django_botmanager.egg-info/dependency_links.txt
28
+ django_botmanager.egg-info/pbr.json
27
29
  django_botmanager.egg-info/requires.txt
28
30
  django_botmanager.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ {"is_release": false, "git_version": "52264f9"}
@@ -1,3 +1,3 @@
1
1
  setproctitle==1.1.10
2
- jsonfield==1.0.3
2
+ jsonfield==3.1.0
3
3
  psutil==5.8.0
@@ -3,14 +3,14 @@ from setuptools import setup, find_packages
3
3
 
4
4
  setup(
5
5
  name='django-botmanager',
6
- version='0.1.14',
6
+ version='0.2.15',
7
7
  description='Async tasks for django',
8
8
  author='Dimoha',
9
9
  author_email='dimoha@controlstyle.ru',
10
10
  url='https://github.com/dimoha/django-botmanager',
11
11
  install_requires=[
12
12
  "setproctitle==1.1.10",
13
- "jsonfield==1.0.3",
13
+ "jsonfield==3.1.0",
14
14
  "psutil==5.8.0"
15
15
  ],
16
16
  packages=find_packages(),
@@ -1,71 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- from __future__ import unicode_literals
3
- from django.db import models
4
- from jsonfield import JSONField
5
- from datetime import timedelta, datetime
6
- from django.utils import timezone
7
-
8
-
9
- class Task(models.Model):
10
-
11
- STATUS_NEW = 'NEW'
12
- STATUS_IN_PROCESS = 'IN_PROCESS'
13
- STATUS_OK = 'OK'
14
-
15
- STATUSES = (
16
- (STATUS_NEW, u'В ожидании'),
17
- (STATUS_IN_PROCESS, u'Идет загрузка'),
18
- (STATUS_OK, u'Данные загружены'),
19
- )
20
-
21
- name = models.CharField(max_length=256, verbose_name=u'Название')
22
- create_dt = models.DateTimeField(verbose_name=u"Дата создания задачи", auto_now_add=True)
23
- finish_dt = models.DateTimeField(verbose_name=u"Дата завершения", null=True, blank=True)
24
- is_complete = models.BooleanField(verbose_name=u"Выполнена", default=False)
25
- is_failed = models.BooleanField(verbose_name=u"Аварийное завершение", default=False)
26
- is_persistent = models.BooleanField(verbose_name=u"Выполнять пока не завершится успешно", default=True)
27
- in_process = models.BooleanField(verbose_name=u"В процессе", default=False)
28
-
29
- input = JSONField(null=True, blank=True)
30
- output = JSONField(null=True, blank=True)
31
- last_error = JSONField(null=True, blank=True)
32
- extra_params = JSONField(null=True, blank=True)
33
-
34
- last_error_dt = models.DateTimeField(verbose_name=u"Дата последнего fail-а", null=True, blank=True)
35
- queue_key = models.CharField(max_length=32, verbose_name=u'Ключ группировки задач')
36
- failed_action = models.CharField(max_length=256, verbose_name=u'Action, на котором произошла ошибка', null=True, blank=True)
37
- attempt_count = models.SmallIntegerField(verbose_name=u'Счетчик попыток', default=0)
38
- last_attempt_dt = models.DateTimeField(verbose_name=u"Последняя попытка выполнения", null=True, blank=True)
39
- max_attempt_count = models.IntegerField(
40
- verbose_name=u"Максимальное кол-во попыток выполнение (если None, то бесконечно)", null=True, blank=True
41
- )
42
- attempt_period = models.DurationField(verbose_name=u'Период между попытками', default=timedelta(hours=1))
43
- parent = models.ForeignKey('self', verbose_name=u'Родительская задача', null=True, blank=True, related_name='child_tasks', on_delete=models.CASCADE)
44
- priority = models.SmallIntegerField(default=0)
45
-
46
- def __unicode__(self):
47
- return "Task {0} #{1}".format(self.name, self.id)
48
-
49
- @property
50
- def can_execute(self):
51
- if not self.is_complete and not self.in_process:
52
- if self.is_failed:
53
- if self.last_attempt_dt + self.attempt_period > timezone.now():
54
- return False
55
- else:
56
- if self.max_attempt_count is None:
57
- return True
58
- else:
59
- if self.attempt_count < self.max_attempt_count:
60
- return True
61
- else:
62
- return False # надо пофиксить is_complete ?
63
- else:
64
- return True
65
- else:
66
- return False
67
-
68
- class Meta:
69
- db_table = 'botmanager_task'
70
- verbose_name = u"Задача для BotManager"
71
- verbose_name_plural = u"Задачи для BotManager"