Skip to content
This repository was archived by the owner on Jun 30, 2024. It is now read-only.

Commit fab5ae2

Browse files
committed
Merge branch 'progress_course_only'
2 parents eb79218 + 73b9354 commit fab5ae2

File tree

10 files changed

+106
-40
lines changed

10 files changed

+106
-40
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ script:
4747
- cd ../../..
4848
- cp applications/runestone/tests/.coveragerc .
4949
# Now actually run the tests.
50-
- pytest applications/runestone/tests
50+
- pytest -v applications/runestone/tests
5151
- coveralls
5252
notifications:
5353
slack:

controllers/ajax.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,7 @@ def updatelastpage():
650650
db.user_sub_chapter_progress.sub_chapter_id
651651
== lastPageSubchapter
652652
)
653+
& (db.user_sub_chapter_progress.course_name == course)
653654
).update(status=completionFlag, end_date=datetime.datetime.utcnow())
654655
done = True
655656
except Exception:
@@ -718,6 +719,7 @@ def getCompletionStatus():
718719
(db.user_sub_chapter_progress.user_id == auth.user.id)
719720
& (db.user_sub_chapter_progress.chapter_id == lastPageChapter)
720721
& (db.user_sub_chapter_progress.sub_chapter_id == lastPageSubchapter)
722+
& (db.user_sub_chapter_progress.course_name == auth.user.course_name)
721723
).select(db.user_sub_chapter_progress.status)
722724
rowarray_list = []
723725
if result:
@@ -738,6 +740,7 @@ def getCompletionStatus():
738740
sub_chapter_id=lastPageSubchapter,
739741
status=-1,
740742
start_date=datetime.datetime.utcnow(),
743+
course_name=auth.user.course_name,
741744
)
742745
# the chapter might exist without the subchapter
743746
result = db(
@@ -753,7 +756,10 @@ def getCompletionStatus():
753756

754757
def getAllCompletionStatus():
755758
if auth.user:
756-
result = db((db.user_sub_chapter_progress.user_id == auth.user.id)).select(
759+
result = db(
760+
(db.user_sub_chapter_progress.user_id == auth.user.id)
761+
& (db.user_sub_chapter_progress.course_name == auth.user.course_name)
762+
).select(
757763
db.user_sub_chapter_progress.chapter_id,
758764
db.user_sub_chapter_progress.sub_chapter_id,
759765
db.user_sub_chapter_progress.status,
@@ -989,13 +995,11 @@ def getpollresults():
989995
response.headers["content-type"] = "application/json"
990996

991997
query = """select act from useinfo
992-
join (select sid, max(id) mid
993-
from useinfo where event='poll' and div_id = '{}' and course_id = '{}' group by sid) as T
994-
on id = T.mid""".format(
995-
div_id, course
996-
)
998+
join (select sid, max(id) mid
999+
from useinfo where event='poll' and div_id = %s and course_id = %s group by sid) as T
1000+
on id = T.mid"""
9971001

998-
rows = db.executesql(query)
1002+
rows = db.executesql(query, (div_id, course))
9991003

10001004
result_list = []
10011005
for row in rows:
@@ -1720,6 +1724,7 @@ def get_question_source():
17201724
.first()
17211725
)
17221726

1727+
# TODO -- Make sure we don't select a duplicate question.
17231728
if prev_selection:
17241729
questionid = prev_selection.selected_id
17251730
else:

controllers/assignments.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,12 @@ def get_summary():
146146
.first()
147147
)
148148
res = db.executesql(
149-
f"""
149+
"""
150150
select chapter, name, min(score), max(score), to_char(avg(score), '00.999') as mean, count(score) from assignment_questions join questions on question_id = questions.id join question_grades on name = div_id
151-
where assignment_id = {assignment.id} and course_name = '{auth.user.course_name}'
151+
where assignment_id = %s and course_name = %s
152152
group by chapter, name
153153
""",
154+
(assignment.id, auth.user.course_name),
154155
as_dict=True,
155156
)
156157

@@ -673,6 +674,10 @@ def doAssignment():
673674
== q.questions.subchapter
674675
)
675676
& (db.user_sub_chapter_progress.chapter_id == q.questions.chapter)
677+
& (
678+
db.user_sub_chapter_progress.course_name
679+
== auth.user.course_name
680+
)
676681
)
677682
.select()
678683
.first()

controllers/dashboard.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -838,13 +838,14 @@ def active():
838838
course = db(db.courses.id == auth.user.course_id).select().first()
839839

840840
res = db.executesql(
841-
f"""select useinfo.timestamp, useinfo.sid, div_id
841+
"""select useinfo.timestamp, useinfo.sid, div_id
842842
from useinfo join
843843
(select sid, count(*), max(id)
844-
from useinfo where course_id = '{course.course_name}'
844+
from useinfo where course_id = %(cname)s
845845
and event = 'page'
846846
and timestamp > now() - interval '15 minutes' group by sid) as T
847-
on useinfo.id = T.max"""
847+
on useinfo.id = T.max""",
848+
dict(cname=course.course_name),
848849
)
849850

850851
newres = []
@@ -886,11 +887,19 @@ def subchapdetail():
886887
).select(db.questions.name, db.questions.question_type)
887888

888889
res = db.executesql(
889-
f"""
890+
"""
890891
select name, question_type, min(useinfo.timestamp) as first, max(useinfo.timestamp) as last, count(*) as clicks
891-
from questions join useinfo on name = div_id and course_id = '{auth.user.course_name}'
892-
where chapter='{request.vars.chap}' and subchapter = '{request.vars.sub}' and base_course = '{thecourse.base_course}' and sid='{request.vars.sid}'
892+
from questions join useinfo on name = div_id and course_id = %s
893+
where chapter = %s and subchapter = %s
894+
and base_course = %s and sid = %s
893895
group by name, question_type""",
896+
(
897+
auth.user.course_name,
898+
request.vars.chap,
899+
request.vars.sub,
900+
thecourse.base_course,
901+
request.vars.sid,
902+
),
894903
as_dict=True,
895904
)
896905
tdoff = datetime.timedelta(

controllers/default.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,16 +212,21 @@ def index():
212212
db(
213213
(db.user_sub_chapter_progress.user_id == auth.user.id)
214214
& (db.user_sub_chapter_progress.chapter_id == chapter_label)
215+
& (db.user_sub_chapter_progress.course_name == course.course_name)
215216
).count()
216217
== 0
217218
):
218219
db.executesql(
219220
"""
220-
INSERT INTO user_sub_chapter_progress(user_id, chapter_id,sub_chapter_id, status, start_date)
221-
SELECT %s, chapters.chapter_label, sub_chapters.sub_chapter_label, -1, now()
222-
FROM chapters, sub_chapters where sub_chapters.chapter_id = chapters.id and chapters.course_id = '%s';
223-
"""
224-
% (auth.user.id, course.base_course)
221+
INSERT INTO user_sub_chapter_progress(user_id, chapter_id,sub_chapter_id, status, start_date, course_name)
222+
SELECT %(userid)s, chapters.chapter_label, sub_chapters.sub_chapter_label, -1, now(), %(course_name)s
223+
FROM chapters, sub_chapters where sub_chapters.chapter_id = chapters.id and chapters.course_id = %(base_course)s
224+
""",
225+
dict(
226+
userid=auth.user.id,
227+
course_name=course.course_name,
228+
base_course=course.base_course,
229+
),
225230
)
226231
except Exception as e:
227232
logger.error(f"Select Course got Error {e}")

controllers/designer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ def build():
120120
"""
121121
INSERT INTO user_courses(user_id, course_id)
122122
SELECT %s, %s
123-
"""
124-
% (auth.user.id, cid)
123+
""",
124+
(auth.user.id, cid),
125125
)
126126

127127
session.flash = "Course Created Successfully"

models/db_ebook_chapters.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
Field("start_date", "datetime", default=datetime.datetime.utcnow()),
4444
Field("end_date", "datetime"),
4545
Field("status", "integer"), # -1 - not started. 0 - active. 1 - completed
46+
Field("course_name", "string"),
4647
migrate=table_migrate_prefix + "user_sub_chapter_progress.table",
4748
)
4849

@@ -71,17 +72,17 @@ def make_progress_entries(field_dict, id_of_insert):
7172
"""
7273
INSERT INTO user_chapter_progress(user_id, chapter_id, status)
7374
SELECT %s, chapters.chapter_label, -1
74-
FROM chapters where chapters.course_id = '%s';
75-
"""
76-
% (id_of_insert, cname)
75+
FROM chapters where chapters.course_id = %s;
76+
""",
77+
(id_of_insert, cname),
7778
)
7879
db.executesql(
7980
"""
8081
INSERT INTO user_sub_chapter_progress(user_id, chapter_id,sub_chapter_id, status)
8182
SELECT %s, chapters.chapter_label, sub_chapters.sub_chapter_label, -1
82-
FROM chapters, sub_chapters where sub_chapters.chapter_id = chapters.id and chapters.course_id = '%s';
83-
"""
84-
% (id_of_insert, cname)
83+
FROM chapters, sub_chapters where sub_chapters.chapter_id = chapters.id and chapters.course_id = %s;
84+
""",
85+
(id_of_insert, cname),
8586
)
8687

8788

modules/db_dashboard.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -183,22 +183,20 @@ def __init__(self, course_name, users):
183183
# Get summary of logs
184184
self.logs = current.db.executesql(
185185
"""select sid, event, count(*)
186-
from useinfo where course_id = '{}'
186+
from useinfo where course_id = %s
187187
group by sid, event
188-
order by sid, event""".format(
189-
self.course_id
190-
),
188+
order by sid, event""",
189+
[self.course_id],
191190
as_dict=True,
192191
)
193192

194193
self.recent_logs = current.db.executesql(
195194
"""select sid, event, count(*)
196-
from useinfo where course_id = '{}'
195+
from useinfo where course_id = %s
197196
and timestamp > now() - interval '7 days'
198197
group by sid, event
199-
order by sid, event""".format(
200-
self.course_id
201-
),
198+
order by sid, event""",
199+
[self.course_id],
202200
as_dict=True,
203201
)
204202

@@ -207,9 +205,8 @@ def __init__(self, course_name, users):
207205
from useinfo where course_id = '{}'
208206
and timestamp > now() - interval '24 hours'
209207
group by sid, event
210-
order by sid, event""".format(
211-
self.course_id
212-
),
208+
order by sid, event""",
209+
[self.course_id],
213210
as_dict=True,
214211
)
215212

@@ -488,6 +485,10 @@ def load_chapter_metrics(self, chapter):
488485
& ( # todo: missing link from course_id to chapter/sub_chapter progress
489486
current.db.user_sub_chapter_progress.chapter_id == chapter.chapter_label
490487
)
488+
& (
489+
current.db.user_sub_chapter_progress.course_name
490+
== self.course.course_name
491+
)
491492
).select(
492493
current.db.auth_user.username,
493494
current.db.user_sub_chapter_progress.chapter_id,
@@ -560,6 +561,10 @@ def load_user_metrics(self, username):
560561

561562
self.db_chapter_progress = current.db(
562563
(current.db.user_sub_chapter_progress.user_id == self.user.id)
564+
& (
565+
current.db.user_sub_chapter_progress.course_name
566+
== self.course.course_name
567+
)
563568
).select(
564569
current.db.user_sub_chapter_progress.chapter_id,
565570
current.db.user_sub_chapter_progress.sub_chapter_id,

rsmanage/initialize_tables.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ def try_running(sql_command):
128128
"""CREATE INDEX us_sid_idx ON public.user_state USING btree (user_id)""", # New
129129
"""CREATE INDEX user_sub_chapter_progress_chapter_id_idx ON user_sub_chapter_progress USING btree (chapter_id);""",
130130
"""CREATE INDEX user_sub_chapter_progress_user_id_idx ON user_sub_chapter_progress USING btree (user_id)""", # New
131+
"""CREATE INDEX user_sub_chapter_progress_course_name_idx ON user_sub_chapter_progress USING btree (course_name)""",
131132
"""CREATE UNIQUE INDEX courses_course_name_idx ON courses USING btree (course_name)""", # New
132133
"""CREATE UNIQUE INDEX q_comp_unique ON competency USING btree (question, competency)""",
133134
"""CREATE UNIQUE INDEX selector_sid_unique ON selected_questions USING btree (selector_id, sid)""",

tests/test_ajax2.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,37 @@ def test_GetLastPage(test_client, test_user_1):
533533
assert "Test chapter 1" in res[0]["lastPageChapter"]
534534

535535

536+
def test_LastPageCrossCourse(test_client, test_user_1, runestone_db_tools):
537+
538+
course_2 = runestone_db_tools.create_course("test_course_2")
539+
test_user_1.login()
540+
orig_course = test_user_1.course.course_name
541+
542+
test_user_1.update_profile("Support Runestone", course_name=course_2.course_name)
543+
kwargs = dict(
544+
course="test_course_2",
545+
lastPageUrl="test_chapter_1/subchapter_a.html",
546+
lastPageScrollLocation=100,
547+
completionFlag="1",
548+
)
549+
# Call ``getlastpage`` first to insert a new record.
550+
test_client.post("ajax/getlastpage", data=kwargs)
551+
552+
# Then, we can update it with the required info.
553+
test_client.post("ajax/updatelastpage", data=kwargs)
554+
test_user_1.update_profile(course_name=orig_course)
555+
556+
kwargs = dict(
557+
course=test_user_1.course.course_name,
558+
lastPageUrl="test_chapter_1/subchapter_a.html",
559+
lastPageScrollLocation=100,
560+
completionFlag="1",
561+
)
562+
# Now, test a query.
563+
res = ajaxCall(test_client, "getlastpage", **kwargs)
564+
assert res is None
565+
566+
536567
def test_GetTop10Answers(test_client, test_user_1, test_user):
537568
user_ids = []
538569
for index in range(0, 6):
@@ -813,6 +844,10 @@ def test_updatelastpage(test_client, test_user_1, runestone_db_tools):
813844
db(
814845
(db.user_sub_chapter_progress.user_id == test_user_1.user_id)
815846
& (db.user_sub_chapter_progress.sub_chapter_id == "subchapter_a")
847+
& (
848+
db.user_sub_chapter_progress.course_name
849+
== test_user_1.course.course_name
850+
)
816851
)
817852
.select()
818853
.first()

0 commit comments

Comments
 (0)