diff --git a/app/portal/report.py b/app/portal/report.py index 511c396..8899037 100644 --- a/app/portal/report.py +++ b/app/portal/report.py @@ -12,38 +12,40 @@ from app.models.mirrors import Proxy, Origin, Country report = Blueprint("report", __name__) -def countries_report(): +def generate_subqueries(): + DeprecationAlias = aliased(Deprecation) now = datetime.utcnow() - hours_24_ago = now - timedelta(hours=24) - hours_72_ago = now - timedelta(hours=72) - deprecations_24hr_subquery = ( db.session.query( - Proxy.origin_id, - func.count(Deprecation.id).label('deprecations_24hr') + DeprecationAlias.resource_id, + func.count(DeprecationAlias.resource_id).label('deprecations_24hr') ) - .join(Deprecation, Proxy.id == Deprecation.resource_id) .filter( - Deprecation.deprecated_at >= hours_24_ago, - Deprecation.resource_type == "Proxy" + DeprecationAlias.reason.like('block_%'), + DeprecationAlias.deprecated_at >= now - timedelta(hours=24), + DeprecationAlias.resource_type == 'Proxy' ) - .group_by(Proxy.origin_id) + .group_by(DeprecationAlias.resource_id) .subquery() ) - deprecations_72hr_subquery = ( db.session.query( - Proxy.origin_id, - func.count(Deprecation.id).label('deprecations_72hr') + DeprecationAlias.resource_id, + func.count(DeprecationAlias.resource_id).label('deprecations_72hr') ) - .join(Deprecation, Proxy.id == Deprecation.resource_id) .filter( - Deprecation.deprecated_at >= hours_72_ago, - Deprecation.resource_type == "Proxy" + DeprecationAlias.reason.like('block_%'), + DeprecationAlias.deprecated_at >= now - timedelta(hours=72), + DeprecationAlias.resource_type == 'Proxy' ) - .group_by(Proxy.origin_id) + .group_by(DeprecationAlias.resource_id) .subquery() ) + return deprecations_24hr_subquery, deprecations_72hr_subquery + + +def countries_report(): + deprecations_24hr_subquery, deprecations_72hr_subquery = generate_subqueries() return ( db.session.query( @@ -53,13 +55,32 @@ def countries_report(): ) .join(Origin, Country.origins) .join(Proxy, Origin.proxies) - .outerjoin(deprecations_24hr_subquery, Origin.id == deprecations_24hr_subquery.c.origin_id) - .outerjoin(deprecations_72hr_subquery, Origin.id == deprecations_72hr_subquery.c.origin_id) + .outerjoin(deprecations_24hr_subquery, Proxy.id == deprecations_24hr_subquery.c.resource_id) + .outerjoin(deprecations_72hr_subquery, Proxy.id == deprecations_72hr_subquery.c.resource_id) .group_by(Country.id) .all() ) +def origins_report(): + deprecations_24hr_subquery, deprecations_72hr_subquery = generate_subqueries() + + return ( + db.session.query( + Origin, + func.coalesce(func.sum(deprecations_24hr_subquery.c.deprecations_24hr), 0).label('total_deprecations_24hr'), + func.coalesce(func.sum(deprecations_72hr_subquery.c.deprecations_72hr), 0).label('total_deprecations_72hr') + ) + .outerjoin(Proxy, Origin.proxies) + .outerjoin(deprecations_24hr_subquery, Proxy.id == deprecations_24hr_subquery.c.resource_id) + .outerjoin(deprecations_72hr_subquery, Proxy.id == deprecations_72hr_subquery.c.resource_id) + .filter(Origin.destroyed.is_(None)) + .group_by(Origin.id) + .order_by(desc("total_deprecations_24hr")) + .all() + ) + + @report.app_template_filter('country_name') def country_description_filter(country_code): country = Country.query.filter_by(country_code=country_code).first() @@ -78,66 +99,8 @@ def report_blocks() -> ResponseReturnValue: ).filter(and_(Proxy.deprecated > datetime.utcnow() - timedelta(days=1), Proxy.deprecation_reason.like('block_%'))).all() - # Aliased to avoid confusion in the join - DeprecationAlias = aliased(Deprecation) - - # Current time - now = datetime.utcnow() - - # Subquery for deprecations in the last 24 hours - deprecations_24hr_subquery = ( - db.session.query( - DeprecationAlias.resource_id, - func.count(DeprecationAlias.resource_id).label('deprecations_24hr') - ) - .filter( - DeprecationAlias.deprecated_at >= now - timedelta(hours=24), - DeprecationAlias.resource_type == 'Proxy' # Adjust based on your polymorphic setup - ) - .group_by(DeprecationAlias.resource_id) - .subquery() - ) - - # Subquery for deprecations in the last 72 hours - deprecations_72hr_subquery = ( - db.session.query( - DeprecationAlias.resource_id, - func.count(DeprecationAlias.resource_id).label('deprecations_72hr') - ) - .filter( - DeprecationAlias.deprecated_at >= now - timedelta(hours=72), - DeprecationAlias.resource_type == 'Proxy' # Adjust based on your polymorphic setup - ) - .group_by(DeprecationAlias.resource_id) - .subquery() - ) - - origins_with_deprecations = ( - db.session.query( - Origin, - func.coalesce(func.sum(deprecations_24hr_subquery.c.deprecations_24hr), 0).label('total_deprecations_24hr'), - func.coalesce(func.sum(deprecations_72hr_subquery.c.deprecations_72hr), 0).label('total_deprecations_72hr') - ) - .outerjoin(Proxy, Origin.proxies) - .outerjoin(deprecations_24hr_subquery, Proxy.id == deprecations_24hr_subquery.c.resource_id) - .outerjoin(deprecations_72hr_subquery, Proxy.id == deprecations_72hr_subquery.c.resource_id) - .filter(Origin.destroyed.is_(None)) - .group_by(Origin.id) - .order_by(desc("total_deprecations_24hr")) - .all() - ) - - countries = ( - db.session.query(Country) - .outerjoin(Origin, Country.origins) - .outerjoin(Proxy, Origin.proxies) - .filter(Country.destroyed.is_(None)) - .group_by(Country.id) - .all() - ) - return render_template("report_blocks.html.j2", blocked_today=blocked_today, - origins=origins_with_deprecations, - countries=sorted(countries_report(), key=lambda c: c[0].risk_level), + origins=sorted(origins_report(), key=lambda o: o[1], reverse=True), + countries=sorted(countries_report(), key=lambda c: c[0].risk_level, reverse=True), ) diff --git a/app/portal/templates/report_blocks.html.j2 b/app/portal/templates/report_blocks.html.j2 index a6afc5a..2e47f1d 100644 --- a/app/portal/templates/report_blocks.html.j2 +++ b/app/portal/templates/report_blocks.html.j2 @@ -26,6 +26,37 @@
+

Bypass Censorship

+

Geography Censorship Report

+ + + + + + + + {% for country in countries %} + + + + + + + {% endfor %} +
CountryRisk Level24h72h
{{ country[0].country_code | country_flag }} {{ country[0].description }}{{ country[0].risk_level }}{{ country[1] }}{{ country[2] }}
+
+

Bypass Censorship

Origin Censorship Report

@@ -50,9 +81,9 @@ style="background-color: {% if origin[0].risk_level[country] > 15 %} red - {% elif origin[0].risk_level[country] > 10 %} - yellow {% elif origin[0].risk_level[country] > 5 %} + yellow + {% elif origin[0].risk_level[country] > 0 %} green {% else %} lightgray @@ -62,37 +93,7 @@ {% endfor %} {% endfor %}
-
-

Bypass Censorship

-

Geography Censorship Report

- - - - - - - - {% for country in countries %} - - - - - - - {% endfor %} -
CountryRisk Level24h72h
{{ country[0].country_code | country_flag }} {{ country[0].description }}{{ country[0].risk_level }}{{ country[1] }}{{ country[2] }}