示例#1
0
文件: models.py 项目: daevaorn/cicero
    def add_read_articles(self, articles):
        '''
        Добавляет новые статьи к списку прочитанных.

        Статьи передаются в виде queryset.
        '''

        # Нужно еще раз считать read_articles с "for update", чтобы параллельные транзакции
        # не затирали друг друга
        cursor = connection.cursor()
        sql = 'select read_articles from %s where %s = %%s for update' % (self._meta.db_table, self._meta.pk.attname)
        cursor.execute('begin')
        cursor.execute(sql, [self._get_pk_val()])
        self.read_articles = cursor.fetchone()[0]

        query = Q()
        for range in self.read_articles:
            query = query | Q(id__range=range)
        ids = [a['id'] for a in articles.exclude(query).values('id')]
        merged = self.read_articles
        for range in ranges.compile_ranges(ids):
            merged = ranges.merge_range(range, merged)
        try:
            article = Article.objects.filter(created__lt=date.today() - timedelta(settings.CICERO_UNREAD_TRACKING_PERIOD)).order_by('-created')[0]
            merged = ranges.merge_range((0, article.id), merged)
        except IndexError:
            pass
        if self.read_articles != merged:
            self.read_articles = merged
            return True
        else:
            return False
示例#2
0
    def add_read_articles(self, articles):
        '''
        Добавляет новые статьи к списку прочитанных.

        Статьи передаются в виде queryset.
        '''

        # Нужно еще раз считать read_articles с "for update", чтобы параллельные транзакции
        # не затирали друг друга
        self.read_articles = (Profile.objects.select_for_update()
                                             .filter(pk=self._get_pk_val())
                                             .values_list('read_articles', flat=True)[0])

        query = Q()

        for range in self.read_articles:
            query = query | Q(id__range=range)

        ids = [a['id'] for a in articles.exclude(query).values('id')]
        merged = self.read_articles

        for range in ranges.compile_ranges(ids):
            merged = ranges.merge_range(range, merged)

        try:
            article = Article.objects.filter(created__lt=date.today() - timedelta(settings.CICERO_UNREAD_TRACKING_PERIOD)).order_by('-created')[0]
            merged = ranges.merge_range((0, article.id), merged)
        except IndexError:
            pass

        if self.read_articles != merged:
            self.read_articles = merged
            return True
        else:
            return False
示例#3
0
    def add_read_articles(self, articles):
        '''
        Добавляет новые статьи к списку прочитанных.

        Статьи передаются в виде queryset.
        '''

        return

        # Нужно еще раз считать read_articles с "for update", чтобы параллельные транзакции
        # не затирали друг друга
        cursor = connection.cursor()
        sql = 'select read_articles from %s where %s = %%s for update' % (
            self._meta.db_table, self._meta.pk.attname)
        cursor.execute('begin')
        cursor.execute(sql, [self._get_pk_val()])
        self.read_articles = cursor.fetchone()[0]

        query = Q()
        for range in self.read_articles:
            query = query | Q(id__range=range)
        ids = [a['id'] for a in articles.exclude(query).values('id')]
        merged = self.read_articles
        for range in ranges.compile_ranges(ids):
            merged = ranges.merge_range(range, merged)
        try:
            article = Article.objects.filter(
                created__lt=date.today() -
                timedelta(settings.CICERO_UNREAD_TRACKING_PERIOD)).order_by(
                    '-created')[0]
            merged = ranges.merge_range((0, article.id), merged)
        except IndexError:
            pass
        if self.read_articles != merged:
            self.read_articles = merged
            return True
        else:
            return False
示例#4
0
    def add_read_articles(self, articles):
        '''
        Добавляет новые статьи к списку прочитанных.

        Статьи передаются в виде queryset.
        '''

        # Нужно еще раз считать read_articles с "for update", чтобы параллельные транзакции
        # не затирали друг друга
        self.read_articles = (Profile.objects.select_for_update().filter(
            pk=self._get_pk_val()).values_list('read_articles', flat=True)[0])

        query = Q()

        for range in self.read_articles:
            query = query | Q(id__range=range)

        ids = [a['id'] for a in articles.exclude(query).values('id')]
        merged = self.read_articles

        for range in ranges.compile_ranges(ids):
            merged = ranges.merge_range(range, merged)

        try:
            article = Article.objects.filter(
                created__lt=date.today() -
                timedelta(settings.CICERO_UNREAD_TRACKING_PERIOD)).order_by(
                    '-created')[0]
            merged = ranges.merge_range((0, article.id), merged)
        except IndexError:
            pass

        if self.read_articles != merged:
            self.read_articles = merged
            return True
        else:
            return False