Compare commits
No commits in common. "c648fe8c52aa97a6429a5cc8bda09b3da68d2e3f" and "5f4724874eeb4d486ef8dce499f876b785970eeb" have entirely different histories.
c648fe8c52
...
5f4724874e
14 changed files with 63 additions and 73 deletions
|
@ -1,14 +1,6 @@
|
||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
1.19 - released 2025-04-16
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
* manpage updated
|
|
||||||
* added -n option for dry-runs
|
|
||||||
* removed mailman 2.x support
|
|
||||||
* added "councilml" start/stop support for member files
|
|
||||||
|
|
||||||
1.18 - released 2025-01-06
|
1.18 - released 2025-01-06
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
|
|
22
members-base-stats.gp
Normal file
22
members-base-stats.gp
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
set terminal pngcairo size 1000,600
|
||||||
|
set title "Members stats"
|
||||||
|
set output 'members-base-stats-2023-11.png'
|
||||||
|
|
||||||
|
src='members-base-stats-2023-11.data'
|
||||||
|
|
||||||
|
set timefmt "%Y-%m"
|
||||||
|
set xdata time
|
||||||
|
set format x "%Y-%m"
|
||||||
|
|
||||||
|
set xlabel "Month"
|
||||||
|
set ylabel "Members"
|
||||||
|
|
||||||
|
set grid
|
||||||
|
|
||||||
|
set key out right
|
||||||
|
|
||||||
|
plot[1420066800:][0:] \
|
||||||
|
src u 1:3 w l lw 2 t 'active', \
|
||||||
|
src u 1:4 w l t 'suspended', \
|
||||||
|
src u 1:5 w l t 'students', \
|
||||||
|
src u 1:6 w l t 'destroyed'
|
|
@ -187,8 +187,8 @@ PROGRESS-SOURCES=progress.scm util-time.import.scm
|
||||||
progress.o: progress.import.scm
|
progress.o: progress.import.scm
|
||||||
progress.import.scm: $(PROGRESS-SOURCES)
|
progress.import.scm: $(PROGRESS-SOURCES)
|
||||||
|
|
||||||
EXPORT-CARDS-SOURCES=export-cards.scm util-bst-ldict.import.scm \
|
EXPORT-CARDS-SOURCES=export-cards.scm util-bst-ldict.import.scm \
|
||||||
mbase.import.scm brmember.import.scm configuration.import.scm
|
mbase.import.scm brmember.import.scm
|
||||||
|
|
||||||
export-cards.o: export-cards.import.scm
|
export-cards.o: export-cards.import.scm
|
||||||
export-cards.import.scm: $(EXPORT-CARDS-SOURCES)
|
export-cards.import.scm: $(EXPORT-CARDS-SOURCES)
|
||||||
|
|
|
@ -61,8 +61,7 @@
|
||||||
grantstart grantstop
|
grantstart grantstop
|
||||||
joined destroyed
|
joined destroyed
|
||||||
feestart feestop
|
feestart feestop
|
||||||
phone
|
phone))
|
||||||
councilmlstart councilmlstop))
|
|
||||||
(define ignored-keys '(mail2))
|
(define ignored-keys '(mail2))
|
||||||
|
|
||||||
(define known-keys (append mandatory-keys optional-keys))
|
(define known-keys (append mandatory-keys optional-keys))
|
||||||
|
@ -89,9 +88,6 @@
|
||||||
|
|
||||||
(feestart fee start)
|
(feestart fee start)
|
||||||
(feestop fee stop)
|
(feestop fee stop)
|
||||||
|
|
||||||
(councilmlstart councilml start)
|
|
||||||
(councilmlstop councilml stop)
|
|
||||||
))
|
))
|
||||||
(define start-stop-markers (map car start-stop-markers-lookup))
|
(define start-stop-markers (map car start-stop-markers-lookup))
|
||||||
|
|
||||||
|
@ -118,7 +114,7 @@
|
||||||
(info
|
(info
|
||||||
,(lambda (mr output key value)
|
,(lambda (mr output key value)
|
||||||
(case key
|
(case key
|
||||||
((student suspend member revision chair council grant fee councilml)
|
((student suspend member revision chair council grant fee)
|
||||||
(let* ((res (period-markers->cal-periods value))
|
(let* ((res (period-markers->cal-periods value))
|
||||||
(ok? (car res))
|
(ok? (car res))
|
||||||
(periods0 (cadr res))
|
(periods0 (cadr res))
|
||||||
|
|
|
@ -65,7 +65,6 @@
|
||||||
|
|
||||||
brmember-chair?
|
brmember-chair?
|
||||||
brmember-council?
|
brmember-council?
|
||||||
brmember-councilml?
|
|
||||||
brmember-revision?
|
brmember-revision?
|
||||||
brmember-grant?
|
brmember-grant?
|
||||||
|
|
||||||
|
@ -395,7 +394,6 @@
|
||||||
;; Predicates for all organizational bodies recognized
|
;; Predicates for all organizational bodies recognized
|
||||||
(define brmember-chair? (brmember-body? 'chair))
|
(define brmember-chair? (brmember-body? 'chair))
|
||||||
(define brmember-council? (brmember-body? 'council))
|
(define brmember-council? (brmember-body? 'council))
|
||||||
(define brmember-councilml? (brmember-body? 'councilml))
|
|
||||||
(define brmember-revision? (brmember-body? 'revision))
|
(define brmember-revision? (brmember-body? 'revision))
|
||||||
(define brmember-grant? (brmember-body? 'grant))
|
(define brmember-grant? (brmember-body? 'grant))
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,6 @@
|
||||||
*mailman3-sql*
|
*mailman3-sql*
|
||||||
*mailman3-sql-path*
|
*mailman3-sql-path*
|
||||||
*notifications-cc*
|
*notifications-cc*
|
||||||
*dummy-run*
|
|
||||||
|
|
||||||
load-configuration!
|
load-configuration!
|
||||||
)
|
)
|
||||||
|
@ -101,7 +100,7 @@
|
||||||
|
|
||||||
;; Which version of mailman to use
|
;; Which version of mailman to use
|
||||||
(define *mailman-version* (make-parameter #f))
|
(define *mailman-version* (make-parameter #f))
|
||||||
(define =mailman-version= 3)
|
(define =mailman-version= 2)
|
||||||
|
|
||||||
;; What is the mailman 3 command
|
;; What is the mailman 3 command
|
||||||
(define *mailman3-bin* (make-parameter #f))
|
(define *mailman3-bin* (make-parameter #f))
|
||||||
|
@ -112,7 +111,7 @@
|
||||||
;; A string is the default, gets converted to boolean at the end of
|
;; A string is the default, gets converted to boolean at the end of
|
||||||
;; loading configuration
|
;; loading configuration
|
||||||
(define *mailman3-sql* (make-parameter #f))
|
(define *mailman3-sql* (make-parameter #f))
|
||||||
(define =mailman3-sql= "1")
|
(define =mailman3-sql= "0")
|
||||||
|
|
||||||
;; The path to SQLite3 DB file
|
;; The path to SQLite3 DB file
|
||||||
(define *mailman3-sql-path* (make-parameter #f))
|
(define *mailman3-sql-path* (make-parameter #f))
|
||||||
|
@ -122,9 +121,6 @@
|
||||||
(define *notifications-cc* (make-parameter #f))
|
(define *notifications-cc* (make-parameter #f))
|
||||||
(define =notifications-cc= "rada@brmlab.cz")
|
(define =notifications-cc= "rada@brmlab.cz")
|
||||||
|
|
||||||
;; If #t, do not do anything
|
|
||||||
(define *dummy-run* (make-parameter #f))
|
|
||||||
|
|
||||||
(define (load-single-configuration! fname)
|
(define (load-single-configuration! fname)
|
||||||
(when (file-exists? fname)
|
(when (file-exists? fname)
|
||||||
(let loop ((lines (read-lines (open-input-file fname))))
|
(let loop ((lines (read-lines (open-input-file fname))))
|
||||||
|
|
|
@ -38,8 +38,7 @@
|
||||||
(chicken irregex)
|
(chicken irregex)
|
||||||
util-bst-ldict
|
util-bst-ldict
|
||||||
mbase
|
mbase
|
||||||
brmember
|
brmember)
|
||||||
configuration)
|
|
||||||
|
|
||||||
;; Prints single card type records.
|
;; Prints single card type records.
|
||||||
(define (cards-print/type mb type)
|
(define (cards-print/type mb type)
|
||||||
|
@ -85,8 +84,7 @@
|
||||||
|
|
||||||
;; Exports cards and desfires to the files specified.
|
;; Exports cards and desfires to the files specified.
|
||||||
(define (cards-export mb cardsfn desfirefn)
|
(define (cards-export mb cardsfn desfirefn)
|
||||||
(when (not (*dummy-run*))
|
(cards-export/type mb 'card cardsfn)
|
||||||
(cards-export/type mb 'card cardsfn)
|
(cards-export/type mb 'desfire desfirefn))
|
||||||
(cards-export/type mb 'desfire desfirefn)))
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -191,11 +191,10 @@
|
||||||
|
|
||||||
;; Generates all members in given directory
|
;; Generates all members in given directory
|
||||||
(define (gen-html-members mb dir)
|
(define (gen-html-members mb dir)
|
||||||
(when (not (*dummy-run*))
|
(ensure-directory dir)
|
||||||
(ensure-directory dir)
|
(with-mbase-progress%
|
||||||
(with-mbase-progress%
|
mb dir mr
|
||||||
mb dir mr
|
(gen-html-member mr dir))
|
||||||
(gen-html-member mr dir))
|
(clean-members-files mb dir))
|
||||||
(clean-members-files mb dir)))
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -116,8 +116,6 @@
|
||||||
(-mailman3-sql-path (path) "Set mailman3 direct SQL access path"
|
(-mailman3-sql-path (path) "Set mailman3 direct SQL access path"
|
||||||
(*mailman3-sql* "1")
|
(*mailman3-sql* "1")
|
||||||
(*mailman3-sql-path* path))
|
(*mailman3-sql-path* path))
|
||||||
(-n () "Do not do anything"
|
|
||||||
(*dummy-run* #t))
|
|
||||||
""
|
""
|
||||||
"Email options:"
|
"Email options:"
|
||||||
(-from (email) "Sender email address"
|
(-from (email) "Sender email address"
|
||||||
|
|
|
@ -73,7 +73,6 @@
|
||||||
(define (rada-ml-pred? mr)
|
(define (rada-ml-pred? mr)
|
||||||
(or (brmember-council? mr)
|
(or (brmember-council? mr)
|
||||||
(brmember-chair? mr)
|
(brmember-chair? mr)
|
||||||
(brmember-revision? mr)
|
(brmember-revision? mr)))
|
||||||
(brmember-councilml? mr)))
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -37,8 +37,7 @@
|
||||||
(chicken base)
|
(chicken base)
|
||||||
(chicken format)
|
(chicken format)
|
||||||
sqlite3
|
sqlite3
|
||||||
configuration
|
configuration)
|
||||||
(chicken condition))
|
|
||||||
|
|
||||||
;; Thread-local parameter to re-use SQLite3 DB handle for subsequent queries
|
;; Thread-local parameter to re-use SQLite3 DB handle for subsequent queries
|
||||||
(define *cached-mailman3-db* (make-parameter #f))
|
(define *cached-mailman3-db* (make-parameter #f))
|
||||||
|
@ -56,15 +55,10 @@
|
||||||
;; Returns the list of mailman3 mailinglists by querying te
|
;; Returns the list of mailman3 mailinglists by querying te
|
||||||
;; underlying SQLite3 DB directly
|
;; underlying SQLite3 DB directly
|
||||||
(define (list-mailman3-sql-lists)
|
(define (list-mailman3-sql-lists)
|
||||||
(handle-exceptions
|
(let-values (((stmt _)
|
||||||
ex
|
(prepare (mailman3-db)
|
||||||
'()
|
"SELECT list_name FROM mailinglist")))
|
||||||
(let ((result
|
(map-row identity stmt)))
|
||||||
(let-values (((stmt _)
|
|
||||||
(prepare (mailman3-db)
|
|
||||||
"SELECT list_name FROM mailinglist")))
|
|
||||||
(map-row identity stmt))))
|
|
||||||
result)))
|
|
||||||
|
|
||||||
;; Returns a list of email addresses subscribed to given mailinglist
|
;; Returns a list of email addresses subscribed to given mailinglist
|
||||||
(define (list-mailman3-sql-list-members lst)
|
(define (list-mailman3-sql-list-members lst)
|
||||||
|
|
|
@ -94,29 +94,27 @@
|
||||||
|
|
||||||
;; Adds given email
|
;; Adds given email
|
||||||
(define (add-email-to-mailman3-list lst email)
|
(define (add-email-to-mailman3-list lst email)
|
||||||
(print "Add " email " to " lst "." (if (*dummy-run*) " [no-op]" ""))
|
(print "Add " email " to " lst ".")
|
||||||
(when (not (*dummy-run*))
|
(let ((result
|
||||||
(let ((result
|
(mailman3-send/recv
|
||||||
(mailman3-send/recv
|
(list "addmembers" "-" (format "~A@brmlab.cz" lst))
|
||||||
(list "addmembers" "-" (format "~A@brmlab.cz" lst))
|
email)))
|
||||||
email)))
|
(let loop ((lines result))
|
||||||
(let loop ((lines result))
|
(when (not (null? lines))
|
||||||
(when (not (null? lines))
|
(print " | " (car lines))
|
||||||
(print " | " (car lines))
|
(loop (cdr lines))))))
|
||||||
(loop (cdr lines)))))))
|
|
||||||
|
|
||||||
;; Removes given email from given listname
|
;; Removes given email from given listname
|
||||||
(define (remove-email-from-mailman3-list lst email)
|
(define (remove-email-from-mailman3-list lst email)
|
||||||
(print "Remove " email " from " lst "." (if (*dummy-run*) " [no-op]" ""))
|
(print "Remove " email " from " lst ".")
|
||||||
(when (not (*dummy-run*))
|
(let ((result
|
||||||
(let ((result
|
(get-mailman3-output-lines
|
||||||
(get-mailman3-output-lines
|
"delmembers"
|
||||||
"delmembers"
|
"-l" (format "~A@brmlab.cz" lst)
|
||||||
"-l" (format "~A@brmlab.cz" lst)
|
"-m" email)))
|
||||||
"-m" email)))
|
(let loop ((lines result))
|
||||||
(let loop ((lines result))
|
(when (not (null? lines))
|
||||||
(when (not (null? lines))
|
(print " | " (car lines))
|
||||||
(print " | " (car lines))
|
(loop (cdr lines))))))
|
||||||
(loop (cdr lines)))))))
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -114,7 +114,7 @@
|
||||||
(caddr c)))
|
(caddr c)))
|
||||||
(brmember-credit mr))
|
(brmember-credit mr))
|
||||||
#:border '(((#:right light) ... none) ...))))
|
#:border '(((#:right light) ... none) ...))))
|
||||||
((suspend student member council chair revision grant councilml)
|
((suspend student member council chair revision grant)
|
||||||
(let* ((pdata (cons (list "Since" "Until")
|
(let* ((pdata (cons (list "Since" "Until")
|
||||||
(map
|
(map
|
||||||
(lambda (p)
|
(lambda (p)
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
(chicken format))
|
(chicken format))
|
||||||
|
|
||||||
;; Short banner
|
;; Short banner
|
||||||
(define banner-line "HackerBase 1.19 (c) 2023-2025 Brmlab, z.s.")
|
(define banner-line "HackerBase 1.19-dev (c) 2023-2025 Brmlab, z.s.")
|
||||||
|
|
||||||
;; Banner source with numbers for ANSI CSI SGR
|
;; Banner source with numbers for ANSI CSI SGR
|
||||||
(define banner-source "
|
(define banner-source "
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue