Skip to content

Commit 299b927

Browse files
authored
add support for color printing (#277)
* update print schema * add support for color printing quota
1 parent 9ce7d58 commit 299b927

File tree

3 files changed

+58
-9
lines changed

3 files changed

+58
-9
lines changed

ocflib/printing/ocfprinting.sql

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ CREATE TABLE IF NOT EXISTS `refunds` (
2323
`pages` int NOT NULL,
2424
`staffer` varchar(255) NOT NULL,
2525
`reason` varchar(510) NOT NULL,
26+
`color` BOOLEAN NOT NULL,
2627
PRIMARY KEY(`id`)
2728
) ENGINE=InnoDB;
2829

@@ -85,13 +86,29 @@ CREATE VIEW jobs_semester AS
8586
WHERE DATE(jobs.time) >= semester_start(CURDATE())
8687
GROUP BY user;
8788

89+
DROP VIEW IF EXISTS jobs_color;
90+
CREATE VIEW jobs_color AS
91+
SELECT user, SUM(pages) AS pages
92+
FROM jobs
93+
WHERE DATE(jobs.time) >= semester_start(CURDATE())
94+
AND `queue` = 'admin-only'
95+
GROUP BY user;
96+
8897
DROP VIEW IF EXISTS refunds_semester;
8998
CREATE VIEW refunds_semester AS
9099
SELECT user, SUM(pages) AS pages
91100
FROM refunds
92101
WHERE DATE(refunds.time) >= semester_start(CURDATE())
93102
GROUP BY user;
94103

104+
DROP VIEW IF EXISTS refunds_color;
105+
CREATE VIEW refunds_color AS
106+
SELECT user, SUM(pages) AS pages
107+
FROM refunds
108+
WHERE DATE(refunds.time) >= semester_start(CURDATE())
109+
AND refunds.color = 1
110+
GROUP BY user;
111+
95112
DROP VIEW IF EXISTS printed_semester;
96113
CREATE VIEW `printed_semester` AS
97114
SELECT
@@ -114,15 +131,40 @@ CREATE VIEW `printed_semester` AS
114131

115132
ORDER BY user;
116133

134+
DROP VIEW IF EXISTS printed_color;
135+
CREATE VIEW `printed_color` AS
136+
SELECT
137+
jobs_color.user AS user,
138+
COALESCE(jobs_color.pages, 0) - COALESCE(refunds_color.pages, 0) AS color
139+
FROM jobs_color
140+
LEFT OUTER JOIN refunds_color
141+
ON jobs_color.user = refunds_color.user
142+
GROUP BY jobs_color.user
143+
144+
UNION
145+
146+
SELECT
147+
refunds_color.user AS user,
148+
COALESCE(jobs_color.pages, 0) - COALESCE(refunds_color.pages, 0) AS color
149+
FROM jobs_color
150+
RIGHT OUTER JOIN refunds_color
151+
ON jobs_color.user = refunds_color.user
152+
GROUP BY refunds_color.user
153+
154+
ORDER BY user;
155+
117156
DROP VIEW IF EXISTS printed;
118157
CREATE VIEW `printed` AS
119158
SELECT
120159
printed_semester.user AS user,
121160
COALESCE(printed_today.today, 0) AS today,
122-
COALESCE(printed_semester.semester, 0) AS semester
161+
COALESCE(printed_semester.semester, 0) AS semester,
162+
COALESCE(printed_color.color, 0) AS color
123163
FROM printed_today
124164
RIGHT OUTER JOIN printed_semester
125165
ON printed_today.user = printed_semester.user
166+
LEFT OUTER JOIN printed_color
167+
ON printed_semester.user = printed_color.user
126168
ORDER BY user;
127169

128170
DROP VIEW IF EXISTS public_jobs;

ocflib/printing/quota.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
WEEKDAY_QUOTA = 30
1111
WEEKEND_QUOTA = 30
1212
SEMESTERLY_QUOTA = 200
13+
COLOR_QUOTA = 10
1314

1415
# Per BoD decision of 2017-04-24, the rules for making changes to the printing
1516
# quota, (non-normatively) summarized, are:
@@ -32,6 +33,7 @@
3233
'user',
3334
'daily',
3435
'semesterly',
36+
'color',
3537
))
3638

3739

@@ -51,6 +53,7 @@
5153
'pages',
5254
'staffer',
5355
'reason',
56+
'color',
5457
))
5558

5659

@@ -73,24 +76,25 @@ def daily_quota(day=None):
7376
def get_quota(c, user):
7477
"""Return a UserQuota representing the user's quota."""
7578
if is_in_group(user, 'opstaff'):
76-
return UserQuota(user, 500, 500)
79+
return UserQuota(user, 500, 500, 500)
7780

7881
if not user_exists(user) or user_is_group(user):
79-
return UserQuota(user, 0, 0)
82+
return UserQuota(user, 0, 0, 0)
8083

8184
c.execute(
82-
'SELECT `today`, `semester` FROM `printed` WHERE `user` = %s',
85+
'SELECT `today`, `semester`, `color` FROM `printed` WHERE `user` = %s',
8386
(user,)
8487
)
8588

8689
row = c.fetchone()
8790
if not row:
88-
row = {'today': 0, 'semester': 0}
91+
row = {'today': 0, 'semester': 0, 'color': 0}
8992
semesterly = SEMESTERLY_QUOTA - int(row['semester'])
9093
return UserQuota(
9194
user=user,
9295
daily=min(semesterly, daily_quota() - int(row['today'])),
9396
semesterly=semesterly,
97+
color=min(semesterly, COLOR_QUOTA - int(row['color'])),
9498
)
9599

96100

tests/printing/quota_test.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
from ocflib.printing.quota import UserQuota
1919
from ocflib.printing.quota import WEEKDAY_QUOTA
2020
from ocflib.printing.quota import WEEKEND_QUOTA
21+
from ocflib.printing.quota import COLOR_QUOTA
2122

2223

2324
FAKE_DAILY_QUOTA = 1000
2425
FAKE_SEMESTERLY_QUOTA = 10000
26+
FAKE_COLOR_QUOTA = 1000
2527

2628
TODAY = datetime.today()
2729
YESTERDAY = TODAY - timedelta(days=1)
@@ -42,6 +44,7 @@
4244
pages=3,
4345
staffer='ckuehl',
4446
reason='just because',
47+
color=0,
4548
)
4649

4750

@@ -84,7 +87,7 @@ def assert_quota(c, user, diff_daily, diff_semesterly):
8487
mock.patch('ocflib.printing.quota.SEMESTERLY_QUOTA', start[1]):
8588
assert (
8689
get_quota(c, user) ==
87-
UserQuota(user, FAKE_DAILY_QUOTA + diff_daily, FAKE_SEMESTERLY_QUOTA + diff_semesterly)
90+
UserQuota(user, FAKE_DAILY_QUOTA + diff_daily, FAKE_SEMESTERLY_QUOTA + diff_semesterly, min(COLOR_QUOTA, FAKE_SEMESTERLY_QUOTA + diff_semesterly))
8891
)
8992

9093

@@ -96,21 +99,21 @@ def test_quota_user_not_in_db(user, mysql_connection):
9699
def test_desk_staff_have_infinite_quota(mysql_connection):
97100
assert (
98101
get_quota(mysql_connection, 'testopstaff') ==
99-
UserQuota('testopstaff', 500, 500)
102+
UserQuota('testopstaff', 500, 500, 500)
100103
)
101104

102105

103106
def test_groups_have_zero_quota(mysql_connection):
104107
assert (
105108
get_quota(mysql_connection, 'ggroup') ==
106-
UserQuota('ggroup', 0, 0)
109+
UserQuota('ggroup', 0, 0, 0)
107110
)
108111

109112

110113
def test_non_existent_users_have_zero_quota(mysql_connection):
111114
assert (
112115
get_quota(mysql_connection, 'nonexist') ==
113-
UserQuota('nonexist', 0, 0)
116+
UserQuota('nonexist', 0, 0, 0)
114117
)
115118

116119

0 commit comments

Comments
 (0)