add category to top 20 files
This commit is contained in:
parent
1c9fe28fc1
commit
7c8fd33b69
15
analytics.py
15
analytics.py
@ -4,6 +4,7 @@ from datetime import datetime, timedelta, timezone
|
|||||||
import geoip2.database
|
import geoip2.database
|
||||||
from auth import require_secret
|
from auth import require_secret
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
import pandas as pd
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import auth
|
import auth
|
||||||
@ -389,6 +390,16 @@ def dashboard():
|
|||||||
cursor = log_db.execute(query, params_for_filter)
|
cursor = log_db.execute(query, params_for_filter)
|
||||||
rows = cursor.fetchall()
|
rows = cursor.fetchall()
|
||||||
|
|
||||||
|
# Convert rows to a list of dictionaries and add category
|
||||||
|
rows = [
|
||||||
|
{
|
||||||
|
'rel_path': rel_path,
|
||||||
|
'access_count': access_count,
|
||||||
|
'category': hf.extract_structure_from_string(rel_path)[0]
|
||||||
|
}
|
||||||
|
for rel_path, access_count in rows
|
||||||
|
]
|
||||||
|
|
||||||
# 2. Distinct device trend
|
# 2. Distinct device trend
|
||||||
# We'll group by hour if "today", by day if "7days"/"30days", by month if "365days"
|
# We'll group by hour if "today", by day if "7days"/"30days", by month if "365days"
|
||||||
if session['timeframe'] == 'last24hours':
|
if session['timeframe'] == 'last24hours':
|
||||||
@ -588,9 +599,6 @@ def dashboard():
|
|||||||
location_data.sort(key=lambda x: x['count'], reverse=True)
|
location_data.sort(key=lambda x: x['count'], reverse=True)
|
||||||
location_data = location_data[:20]
|
location_data = location_data[:20]
|
||||||
|
|
||||||
# Convert the top-files rows to a list of dictionaries
|
|
||||||
rows = [dict(rel_path=r[0], access_count=r[1]) for r in rows]
|
|
||||||
|
|
||||||
title_short = app_config.get('TITLE_SHORT', 'Default Title')
|
title_short = app_config.get('TITLE_SHORT', 'Default Title')
|
||||||
title_long = app_config.get('TITLE_LONG' , 'Default Title')
|
title_long = app_config.get('TITLE_LONG' , 'Default Title')
|
||||||
|
|
||||||
@ -614,7 +622,6 @@ def dashboard():
|
|||||||
|
|
||||||
def export_to_excel():
|
def export_to_excel():
|
||||||
"""Export search_db to an Excel file and store it locally."""
|
"""Export search_db to an Excel file and store it locally."""
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
# Query all data from the search_db
|
# Query all data from the search_db
|
||||||
query = "SELECT * FROM files"
|
query = "SELECT * FROM files"
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import re
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
def extract_date_from_string(string_with_date):
|
def extract_date_from_string(string_with_date):
|
||||||
# grab X.Y.Z where X,Y,Z are 1–4 digits
|
# grab X.Y.Z where X,Y,Z are 1–4 digits
|
||||||
@ -43,4 +44,49 @@ def extract_date_from_string(string_with_date):
|
|||||||
dt = datetime.strptime(date_str, fmt)
|
dt = datetime.strptime(date_str, fmt)
|
||||||
return dt.strftime('%Y-%m-%d')
|
return dt.strftime('%Y-%m-%d')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def extract_structure_from_string(input_string):
|
||||||
|
# extract category and titel from filename
|
||||||
|
filename_ext = os.path.splitext(input_string)[0]
|
||||||
|
left_side, right_side = filename_ext.split('-', 1) if '-' in filename_ext else (filename_ext, None)
|
||||||
|
try:
|
||||||
|
int(left_side.strip())
|
||||||
|
# first part is only a number
|
||||||
|
previous_right_side = right_side
|
||||||
|
left_side, right_side = previous_right_side.split('-', 1) if '-' in previous_right_side else (previous_right_side, None)
|
||||||
|
except:
|
||||||
|
# first part not a number
|
||||||
|
pass
|
||||||
|
|
||||||
|
if 'predig' in left_side.lower():
|
||||||
|
category = 'Predigt'
|
||||||
|
elif 'wort' in left_side.lower() or 'einladung' in left_side.lower():
|
||||||
|
category = 'Vorwort'
|
||||||
|
elif 'chor' in left_side.lower():
|
||||||
|
category = 'Chor'
|
||||||
|
elif 'orchester' in left_side.lower():
|
||||||
|
category = 'Orchester'
|
||||||
|
elif 'gruppenlied' in left_side.lower() or 'jugendlied' in left_side.lower():
|
||||||
|
category = 'Gruppenlied'
|
||||||
|
elif 'gemeinsam' in left_side.lower() or 'gesang' in left_side.lower() or 'lied' in left_side.lower():
|
||||||
|
category = 'Gemeinsamer Gesang'
|
||||||
|
elif 'gedicht' in left_side.lower():
|
||||||
|
category = 'Gedicht'
|
||||||
|
elif 'instrumental' in left_side.lower() or 'musikstück' in left_side.lower():
|
||||||
|
category = 'Instrumental'
|
||||||
|
else:
|
||||||
|
category = None
|
||||||
|
|
||||||
|
if right_side:
|
||||||
|
titel, name = right_side.split('-', 1) if '-' in right_side else (right_side, None)
|
||||||
|
if category == 'Predigt' or category == 'Vorwort' or category == 'Gedicht':
|
||||||
|
if not name: # kein Titel, nur Name
|
||||||
|
name = titel
|
||||||
|
titel = None
|
||||||
|
else:
|
||||||
|
titel = None
|
||||||
|
name = None
|
||||||
|
|
||||||
|
return category, titel, name
|
||||||
@ -110,13 +110,13 @@ def updatefileindex():
|
|||||||
# Retrieve the hit count for this file.
|
# Retrieve the hit count for this file.
|
||||||
hit_count = get_hit_count(relative_path)
|
hit_count = get_hit_count(relative_path)
|
||||||
|
|
||||||
category, titel, name, performance_date, site = None, None, None, None, None
|
|
||||||
|
|
||||||
# Determine the site
|
# Determine the site
|
||||||
if foldername == 'Gottesdienste Speyer':
|
if foldername == 'Gottesdienste Speyer':
|
||||||
site = 'Speyer'
|
site = 'Speyer'
|
||||||
elif foldername == 'Gottesdienste Schwegenheim':
|
elif foldername == 'Gottesdienste Schwegenheim':
|
||||||
site = 'Schwegenheim'
|
site = 'Schwegenheim'
|
||||||
|
else:
|
||||||
|
site = None
|
||||||
|
|
||||||
# Check for a corresponding transcript file in a sibling "Transkription" folder.
|
# Check for a corresponding transcript file in a sibling "Transkription" folder.
|
||||||
parent_dir = os.path.dirname(entry_path)
|
parent_dir = os.path.dirname(entry_path)
|
||||||
@ -130,46 +130,7 @@ def updatefileindex():
|
|||||||
except Exception:
|
except Exception:
|
||||||
transcript = None
|
transcript = None
|
||||||
|
|
||||||
# extract category and titel from filename
|
category, titel, name = hf.extract_structure_from_string(entry.name)
|
||||||
filename_ext = os.path.splitext(entry.name)[0]
|
|
||||||
left_side, right_side = filename_ext.split('-', 1) if '-' in filename_ext else (filename_ext, None)
|
|
||||||
try:
|
|
||||||
int(left_side.strip())
|
|
||||||
# first part is only a number
|
|
||||||
previous_right_side = right_side
|
|
||||||
left_side, right_side = previous_right_side.split('-', 1) if '-' in previous_right_side else (previous_right_side, None)
|
|
||||||
except:
|
|
||||||
# first part not a number
|
|
||||||
pass
|
|
||||||
|
|
||||||
if 'predig' in left_side.lower():
|
|
||||||
category = 'Predigt'
|
|
||||||
elif 'wort' in left_side.lower() or 'einladung' in left_side.lower():
|
|
||||||
category = 'Vorwort'
|
|
||||||
elif 'chor' in left_side.lower():
|
|
||||||
category = 'Chor'
|
|
||||||
elif 'orchester' in left_side.lower():
|
|
||||||
category = 'Orchester'
|
|
||||||
elif 'gruppenlied' in left_side.lower() or 'jugendlied' in left_side.lower():
|
|
||||||
category = 'Gruppenlied'
|
|
||||||
elif 'gemeinsam' in left_side.lower() or 'gesang' in left_side.lower() or 'lied' in left_side.lower():
|
|
||||||
category = 'Gemeinsamer Gesang'
|
|
||||||
elif 'gedicht' in left_side.lower():
|
|
||||||
category = 'Gedicht'
|
|
||||||
elif 'instrumental' in left_side.lower() or 'musikstück' in left_side.lower():
|
|
||||||
category = 'Instrumental'
|
|
||||||
else:
|
|
||||||
category = None
|
|
||||||
|
|
||||||
if right_side:
|
|
||||||
titel, name = right_side.split('-', 1) if '-' in right_side else (right_side, None)
|
|
||||||
if category == 'Predigt' or category == 'Vorwort' or category == 'Gedicht':
|
|
||||||
if not name: # kein Titel, nur Name
|
|
||||||
name = titel
|
|
||||||
titel = None
|
|
||||||
else:
|
|
||||||
titel = None
|
|
||||||
name = None
|
|
||||||
|
|
||||||
performance_date = hf.extract_date_from_string(relative_path)
|
performance_date = hf.extract_date_from_string(relative_path)
|
||||||
|
|
||||||
|
|||||||
@ -222,6 +222,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th>File Path</th>
|
<th>File Path</th>
|
||||||
<th>Access Count</th>
|
<th>Access Count</th>
|
||||||
|
<th>Kategorie</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@ -229,6 +230,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{ row.rel_path }}</td>
|
<td>{{ row.rel_path }}</td>
|
||||||
<td>{{ row.access_count }}</td>
|
<td>{{ row.access_count }}</td>
|
||||||
|
<td>{{ row.category }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user