def check_items(name, items, sr_dict, stop_time): """Checks the items generator for any matching conditions.""" item_count = 0 skip_count = 0 skip_subs = set() start_time = time() seen_subs = set() logging.info('Checking new %ss', name) try: for item in items: # skip any items in /new that have been approved if name == 'submission' and item.approved_by: continue item_time = datetime.utcfromtimestamp(item.created_utc) if item_time <= stop_time: break try: subreddit = sr_dict[item.subreddit.display_name.lower()] except KeyError: skip_count += 1 skip_subs.add(item.subreddit.display_name.lower()) continue conditions = (subreddit.conditions .filter(Condition.parent_id == None) .all()) conditions = filter_conditions(name, conditions) item_count += 1 if subreddit.name not in seen_subs: setattr(subreddit, 'last_'+name, item_time) seen_subs.add(subreddit.name) # check removal conditions, stop checking if any matched if check_conditions(subreddit, item, [c for c in conditions if c.action == 'remove']): continue # check set_flair conditions check_conditions(subreddit, item, [c for c in conditions if c.action == 'set_flair']) # check approval conditions check_conditions(subreddit, item, [c for c in conditions if c.action == 'approve']) # check alert conditions check_conditions(subreddit, item, [c for c in conditions if c.action == 'alert']) # if doing reports, check auto-reapproval if enabled if (name == 'report' and subreddit.auto_reapprove and item.approved_by is not None): try: # see if this item has already been auto-reapproved entry = (AutoReapproval.query.filter( AutoReapproval.permalink == get_permalink(item)) .one()) in_db = True except NoResultFound: entry = AutoReapproval() entry.subreddit_id = subreddit.id entry.permalink = get_permalink(item) entry.original_approver = item.approved_by.name entry.total_reports = 0 entry.first_approval_time = datetime.utcnow() in_db = False if (in_db or item.approved_by.name != cfg_file.get('reddit', 'username')): item.approve() entry.total_reports += item.num_reports entry.last_approval_time = datetime.utcnow() db.session.add(entry) db.session.commit() logging.info(' Re-approved %s', entry.permalink) db.session.commit() except Exception as e: logging.error(' ERROR: %s', e) db.session.rollback() logging.info(' Checked %s items, skipped %s items in %s (skips: %s)', item_count, skip_count, elapsed_since(start_time), ', '.join(skip_subs))