def create_archive(username, category_id, tracker_id, user_id): """ Archive summary of results in the database and store a zip archive in the data directory. """ redis = worker.get_redis() worker.start_job() db_session = worker.get_session() found_count = 0 not_found_count = 0 error_count = 0 results = (db_session.query(Result).options(subqueryload( Result.image_file)).filter(Result.tracker_id == tracker_id).all()) site_count = len(results) # Generate zip file filename = re.sub('[\W_]+', '', username) # Strip non-alphanumeric char zip_file_id = create_zip(filename, results, user_id) for result in results: if result.status == 'e': error_count += 1 elif result.status == 'f': found_count += 1 elif result.status == 'n': not_found_count += 1 archive = Archive(tracker_id=tracker_id, username=username, category_id=category_id, site_count=site_count, found_count=found_count, not_found_count=not_found_count, error_count=error_count, zip_file_id=zip_file_id, user_id=user_id) # Write to db db_session.add(archive) db_session.commit() # Publish message = { 'id': archive.id, 'name': archive.username, 'status': 'created', 'archive': archive.as_dict(), } redis.publish('archive', json.dumps(message)) worker.finish_job()