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
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
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
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