telegram_bots/feeds/models.py

60 lines
1.8 KiB
Python
Raw Normal View History

2019-01-11 19:16:01 +00:00
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
2019-01-19 06:52:00 +00:00
from yamlfield.fields import YAMLField
2019-01-11 19:16:01 +00:00
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)
2019-01-19 06:52:00 +00:00
last_id = YAMLField(null=True, blank=True)
2019-01-11 19:16:01 +00:00
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
2019-01-25 16:33:54 +00:00
self.lock = True
self.save()
2019-03-10 07:20:53 +00:00
execute_feed.apply_async(args=(self.pk,), shadow=str(self))
2019-01-11 19:16:01 +00:00
2019-01-26 06:36:56 +00:00
def __str__(self):
2019-03-10 07:11:59 +00:00
return f'#{self.pk} {self.title}'
2019-01-26 06:36:56 +00:00
2019-01-11 19:16:01 +00:00
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 = '<Not set>'
@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