from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils import timezone from telebot import TeleBot from yamlfield.fields import YAMLField from feeds.tasks import execute_feed class Feed(models.Model): owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) title = models.CharField(max_length=32) chat_id = models.CharField(max_length=33) check_interval = models.DurationField(help_text='in seconds') last_check = models.DateTimeField(null=True, blank=True) last_id = YAMLField(null=True, blank=True) lock = models.BooleanField(default=False) config_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) config_id = models.PositiveIntegerField() config = GenericForeignKey('config_type', 'config_id') def run_check(self): if self.lock: return if self.last_check and timezone.now() < self.last_check + self.check_interval: return self.lock = True self.save() execute_feed.delay(self.pk) def __str__(self): return self.title class Meta: unique_together = ('config_type', 'config_id') class FeedModuleConfig(models.Model): _feeds = GenericRelation(Feed, content_type_field='config_type', object_id_field='config_id') MODULE_NAME = '' @property def feed(self): return self._feeds.get() @property def content_type(self): return ContentType.objects.get_for_model(self.__class__) def execute(self, bot: TeleBot, chat_id, last_id): raise NotImplementedError() class Meta: abstract = True