aboutsummaryrefslogtreecommitdiffstats
path: root/src/acit/types.py
diff options
context:
space:
mode:
authorVosjedev <vosje@vosjedev.net>2025-11-02 13:56:16 +0100
committerVosjedev <vosje@vosjedev.net>2025-11-02 13:56:16 +0100
commit60749b5099a8ba1d63e8cc313c451c8a4001a078 (patch)
treefc3aef71225a0cd8317efd4147b9d345378068d0 /src/acit/types.py
parent29989aface3276d36851c8601ea599ffbeaac471 (diff)
downloadacit-60749b5099a8ba1d63e8cc313c451c8a4001a078.tar.gz
acit-60749b5099a8ba1d63e8cc313c451c8a4001a078.tar.bz2
acit-60749b5099a8ba1d63e8cc313c451c8a4001a078.tar.xz
Too much (I tried to split it up but it won't work)
Diffstat (limited to 'src/acit/types.py')
-rw-r--r--src/acit/types.py133
1 files changed, 112 insertions, 21 deletions
diff --git a/src/acit/types.py b/src/acit/types.py
index 2719590..4c84f26 100644
--- a/src/acit/types.py
+++ b/src/acit/types.py
@@ -1,8 +1,10 @@
-from .db import DBPoolManager
+from threading import RLock
+from datetime import datetime, timedelta
import cherrypy
+from .db import DBPoolManager
BUGSTATUS=["OPEN", "CLOSED", "UNCONF", "REJECT", "UPSTRM"]
BUGTYPES=["BUG", "DISCUS", "PATCH"]
@@ -13,15 +15,16 @@ class Site():
cherrypy.engine.subscribe("db-started",self.on_db_connect)
self.bugcache={}
+ self.last_tracker_update=datetime.fromtimestamp(0)
+ self.tracker_update_lock=RLock()
def on_db_connect(self):
+ cherrypy.log("Setting up database",context="SITE")
with self.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute(
"CREATE TABLE IF NOT EXISTS trackers ("
- "name VARCHAR(80),"
- "category VARCHAR(80),"
- "homepage VARCHAR(1024),"
- "readme_url VARCHAR(1024)"
+ "name VARCHAR(80) PRIMARY KEY,"
+ "homepage VARCHAR(1024)"
")"
)
@@ -44,7 +47,77 @@ class Site():
")"
)
- def getbug(self,tracker:str,bugid):
+ #cur.execute(
+ # "CREATE TABLE IF NOT EXISTS accounts ("
+ # "email VARCHAR(80),"
+ # "hash VARCHAR(80),"
+ # )# TODO
+
+ conn.commit()
+
+ self.update_all_bugpages(conn,cur)
+
+
+ def update_all_bugpages(self,conn,cur,trackerfilter=None):
+ if trackerfilter:
+ cherrypy.engine.publish("regen",trackerfilter,None)
+ else:
+ cur.execute("SELECT name FROM trackers")
+ for [tracker] in cur:
+ cherrypy.engine.publish("regen",tracker,None)
+
+ cur.execute("SELECT tracker,bugid FROM bugs")
+ for [tracker,bugid] in cur:
+ if trackerfilter and not trackerfilter==tracker:
+ continue
+ cherrypy.engine.publish("regen",tracker,bugid)
+
+
+ def update_trackers(self,force=False):
+ from os import getenv
+ import subprocess
+
+ def log(msg,traceback=False):
+ cherrypy.log(msg=msg,traceback=traceback,context="REFRESH")
+
+ with self.tracker_update_lock:
+ if not force and self.last_tracker_update+timedelta(minutes=5)>datetime.now():
+ return
+ log("Updating trackerlist")
+ try:
+ with self.dbpool.get_connection() as conn, conn.cursor() as cur:
+ script=getenv("ACIT_LIST_TRACKERS","/usr/lib/acit-list-trackers")
+ proc=subprocess.run(script,capture_output=True)
+
+ if proc.stderr:
+ log("Refresh script generated STDERR:")
+ log(proc.stderr)
+
+ rows=proc.stdout.decode().split("\n")
+ for row in rows:
+ if row: # skip empty lines
+ data=row.split("\t")
+
+ if not len(data)==2:
+ log("Error processing line:\n> %s\nWeird value count (expected 2)."%row)
+ continue
+
+ name,homepage=data
+
+ log(name)
+
+ cur.execute("REPLACE INTO trackers (name,homepage) VALUES (?,?)",(name,homepage))
+ conn.commit()
+
+ self.update_all_bugpages(conn,cur,trackerfilter=name)
+
+ self.last_tracker_update=datetime.now()
+
+ except Exception:
+ cherrypy.log("Error refreshing trackers using script.",traceback=True,context="SITE")
+
+
+ def getbug(self,tracker:str,bugid:int):
# make sure bug exists
with self.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("SELECT 1 FROM bugs WHERE tracker=? AND bugid=? LIMIT 1",(tracker,bugid))
@@ -64,17 +137,34 @@ class Site():
if not bugtype in BUGTYPES:
raise ValueError("Bugtype illegal")
with self.dbpool.get_connection() as conn, conn.cursor() as cur:
- cur.execute("SELECT TOP 1 bugid FROM bugs WHERE tracker=? SORT BY bugid DESC",(tracker,))
+ cur.execute("SELECT bugid FROM bugs WHERE tracker=? ORDER BY bugid DESC LIMIT 1",(tracker,))
nr=cur.fetchone()
if not nr:
nr=0
+ else:
+ nr=nr[0]
nr+=1
- cur.execute("INSERT INTO bugs VALUES (?,?)",(tracker,nr,"","","OPEN",bugtype))
+ cur.execute("INSERT INTO bugs VALUES (?,?,?,?,?,?)",(tracker,nr,"","","OPEN",bugtype))
+ conn.commit()
return self.getbug(tracker=tracker,bugid=nr)
-
+ def findtrackers(self,query:str):
+ self.update_trackers()
+ with self.dbpool.get_connection() as conn, conn.cursor() as cur:
+ cur.execute("SELECT name FROM trackers")
+ trackers:list[str]=[ value[0] for value in cur.fetchall() ]
+ results=[]
+ for tracker in trackers:
+ if tracker==query:
+ return [tracker]
+ else:
+ if tracker.endswith(query):
+ results.append(tracker)
+ return results
+
+
class Bug():
def __init__(self,site:Site,tracker:str,bugid:int):
@@ -82,7 +172,7 @@ class Bug():
self.tracker=tracker
self.bugid=bugid
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
- cur.execute("SELECT (subject,description,status,type) FROM bugs WHERE tracker=? AND bugid=? LIMIT 1",(tracker,bugid))
+ cur.execute("SELECT subject,description,status,type FROM bugs WHERE tracker=? AND bugid=? LIMIT 1",(tracker,bugid))
data=cur.fetchone()
if not data:
raise ValueError("Bug %s#%d does not exists!"%(tracker,bugid))
@@ -112,6 +202,7 @@ class Bug():
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("UPDATE bugs SET subject=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid))
+ conn.commit()
self._cache["subject"]=value
@property
@@ -126,6 +217,7 @@ class Bug():
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("UPDATE bugs SET description=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid))
+ conn.commit()
self._cache["description"]=value
@property
@@ -140,6 +232,7 @@ class Bug():
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("UPDATE bugs SET status=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid))
+ conn.commit()
self._cache["status"]=value
@property
@@ -154,6 +247,7 @@ class Bug():
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("UPDATE bugs SET type=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid))
+ conn.commit()
self._cache["type"]=value
@property
@@ -164,15 +258,18 @@ class Bug():
"""
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("SELECT email FROM subscribers WHERE tracker=? AND bugid=?",(self.tracker,self.bugid))
+ conn.commit()
return [ value[0] for value in cur ]
def addsubscriber(self,email):
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("INSERT INTO subscribers VALUES (?,?,?)",(self.tracker,self.bugid,email))
+ conn.commit()
def rmsubscriber(self,email):
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("DELETE FROM subscribers WHERE tracker=? AND bugid=? AND email=?)",(self.tracker,self.bugid,email))
+ conn.commit()
class Tracker():
@@ -180,7 +277,7 @@ class Tracker():
self.site=site
self.tracker=tracker
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
- cur.execute("SELECT (name,category,homepage,readme) FROM trackers WHERE name=? LIMIT 1",(tracker,))
+ cur.execute("SELECT name,homepage FROM trackers WHERE name=? LIMIT 1",(tracker,))
data=cur.fetchone()
if not data:
raise ValueError("Tracker %s does not exists!"%tracker)
@@ -195,18 +292,9 @@ class Tracker():
# NOTE: this is a lot of repeated code, maybe we can rewrite this into a __setattr__ and __getattribute__ method?
@property
def name(self):
- "The name of this tracker"
+ "The name of this tracker. readonly, changing a tracker's name randomly seriously messes with the design."
return self._cache["name"]
- @name.setter
- def name(self,value):
- if len(value)>80:
- raise ValueError("Subject length not allowed to be higher than 80, this is %d"%len(value))
-
- with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
- cur.execute("UPDATE trackers SET name=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid))
- self._cache["name"]=value
-
@property
def category(self):
"The category of this tracker"
@@ -219,6 +307,7 @@ class Tracker():
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("UPDATE trackers SET category=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid))
+ conn.commit()
self._cache["category"]=value
@property
@@ -233,6 +322,7 @@ class Tracker():
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("UPDATE trackers SET homepage=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid))
+ conn.commit()
self._cache["homepage"]=value
@property
@@ -247,4 +337,5 @@ class Tracker():
with self.site.dbpool.get_connection() as conn, conn.cursor() as cur:
cur.execute("UPDATE trackers SET readme_url=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid))
+ conn.commit()
self._cache["readme_url"]=value