Skip to content

Commit c699eee

Browse files
committed
Merge pull request #82 from uw-it-aca/qa
Qa to master for textbook card release
2 parents 0236ce9 + c7bffe5 commit c699eee

26 files changed

+443
-169
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ before_script:
1212
- cp travis-ci/manage.py manage.py
1313
- python manage.py syncdb --noinput
1414
script:
15-
- pep8 myuw_mobile/ --exclude=migrations,myuw_mobile/test,myuw_mobile/management
15+
- pep8 myuw_mobile/ --exclude=migrations,myuw_mobile/management,myuw_mobile/test
1616
- jshint myuw_mobile/static/js/ --verbose
1717
- mocha myuw_mobile/static/js/test/ --recursive
1818
- coverage run --source=myuw_mobile/ --omit=myuw_mobile/migrations/* manage.py test myuw_mobile

myuw_mobile/dao/card_display_dates.py

+7
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,18 @@ def get_values_by_date(now, request):
3737
is_before_end_of_summer_reg_display_period1 = False
3838
is_before_end_of_summer_reg_display_periodA = False
3939
is_before_first_day_of_term = False
40+
is_before_eof_7days_of_term = False
4041

4142
if now.date() < current_term.first_day_quarter:
4243
is_before_first_day_of_term = True
4344
# We need to see if we're before this term's 1st day - the term
4445
# switches at the grade submission deadline.
4546
is_after_grade_submission_deadline = True
4647

48+
if now.date() < current_term.first_day_quarter + timedelta(days=8):
49+
# till the end of 7-day (exclude the first day)
50+
is_before_eof_7days_of_term = True
51+
4752
raw_date = current_term.last_day_instruction
4853
d = datetime(raw_date.year, raw_date.month, raw_date.day)
4954
if now >= d + timedelta(days=1):
@@ -107,6 +112,7 @@ def get_values_by_date(now, request):
107112
"is_before_end_of_summer_reg_display_periodA": summerA_end,
108113
"is_before_end_of_summer_reg_display_period1": summer1_end,
109114
"is_before_first_day_of_term": is_before_first_day_of_term,
115+
"is_before_eof_7days_of_term": is_before_eof_7days_of_term,
110116
"last_term": "%s,%s" % (last_term.year, last_term.quarter),
111117
}
112118

@@ -139,6 +145,7 @@ def set_js_overrides(request, values):
139145
'myuw_before_last_day': 'is_before_last_day_of_classes',
140146
'myuw_before_end_of_reg_display': before_reg,
141147
'myuw_before_first_day': 'is_before_first_day_of_term',
148+
'myuw_before_end_of_first_week': 'is_before_eof_7days_of_term',
142149
}
143150

144151
for key, value in MAP.iteritems():

myuw_mobile/dao/term.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919

2020
def get_comparison_date(request):
2121
"""
22-
Allows us to pretend we're at various points in the term,
23-
so we can test against live data sources at various points in the year.
22+
To test at various points in the year,
23+
overrides to the date if specified in the request
24+
otherwise return the default date.
2425
"""
2526
FORMAT = "%Y-%m-%d"
2627

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
"13449": [{
3+
"isbn":"9781256396362",
4+
"title":"Writ of BC",
5+
"authors": [{"name":"Mcdermott"}],
6+
"price":58.00,
7+
"used_price":null,
8+
"required":true,
9+
"notes":"required",
10+
"cover_image": null
11+
},
12+
{
13+
"isbn":"9780521600491",
14+
"title":"History Of EMBA",
15+
"authors":[{"name":"Trigger" }],
16+
"price":45.00,
17+
"used_price":null,
18+
"required":false,
19+
"notes":"this is optional",
20+
"cover_image":null
21+
}],
22+
"13458": [{
23+
"isbn":"9781256496062",
24+
"title":"ESS Stuff 'n Things",
25+
"authors": [{"name":"Mcdermott"}],
26+
"price":58.00,
27+
"used_price":null,
28+
"required":true,
29+
"notes":null,
30+
"cover_image": null
31+
}],
32+
"13464": [{
33+
"isbn":"9785256396062",
34+
"title":"Studies in Bissy Bee",
35+
"authors": [{"name":"Mcdermott"}],
36+
"price":58.00,
37+
"used_price":null,
38+
"required":false,
39+
"notes":null,
40+
"cover_image": null
41+
}]
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"ATermLastDay":null,"AcademicCatalog":"2010-08-01","BTermFirstDay":null,"CensusDay":"2012-01-13","FifthDay":"2012-01-06","FinancialAidYear":null,"FirstDay":"2012-01-03","FirstDayMedSchool":null,"GradeSubmissionDeadline":"2012-03-20T17:00:00","GradingPeriodClose":"2012-04-04T17:00:00","GradingPeriodOpen":"2012-02-27T08:00:00","GradingPeriodOpenATerm":null,"LastAddDay":"2012-01-23","LastAddDayATerm":null,"LastAddDayBTerm":null,"LastDayOfClasses":"2012-03-09","LastDropDay":"2012-02-20","LastDropDayATerm":null,"LastDropDayBTerm":null,"LastDropDayNotRecorded":"2012-01-15","LastDropDayNotRecordedATerm":null,"LastDropDayNotRecordedBTerm":null,"LastFinalExamDay":"2012-03-16","NextTerm":{"Href":"\/student\/v5\/term\/2012,spring.json","Quarter":"spring","Year":2012},"PreviousTerm":{"Href":"\/student\/v5\/term\/2011,autumn.json","Quarter":"autumn","Year":2011},"Quarter":"winter","RegistrationPeriods":[{"EndDate":"2011-11-27","StartDate":"2011-11-04"},{"EndDate":"2012-01-02","StartDate":"2011-11-28"},{"EndDate":"2012-01-09","StartDate":"2012-01-03"}],"RegistrationServicesStart":"2011-10-28","StudentAccountStart":null,"TimeScheduleConstruction":{"Bothell":false,"Seattle":false,"Tacoma":false},"TimeSchedulePublished":{"Bothell":true,"Seattle":true,"Tacoma":true},"Year":2012}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"ATermLastDay":"2014-07-23","AcademicCatalog":"2010-08-01","BTermFirstDay":"2014-07-24","CensusDay":"2014-07-03","FifthDay":"2014-06-27","FinancialAidYear":null,"FirstDay":"2014-06-23","FirstDayMedSchool":null,"GradeSubmissionDeadline":"2014-08-26T17:00:00","GradingPeriodClose":"2014-09-10T17:00:00","GradingPeriodOpen":"2014-08-15T08:00:00","GradingPeriodOpenATerm":"2014-07-17T08:00:00","LastAddDay":"2014-07-13","LastAddDayATerm":"2014-07-13","LastAddDayBTerm":"2014-07-30","LastDayOfClasses":"2014-08-22","LastDropDay":"2014-08-10","LastDropDayATerm":"2014-07-13","LastDropDayBTerm":"2014-08-13","LastDropDayNotRecorded":"2014-07-06","LastDropDayNotRecordedATerm":"2014-06-29","LastDropDayNotRecordedBTerm":"2014-07-30","LastFinalExamDay":"2014-08-22","NextTerm":{"Href":"\/student\/v5\/term\/2014,autumn.json","Quarter":"autumn","Year":2014},"PreviousTerm":{"Href":"\/student\/v5\/term\/2014,spring.json","Quarter":"spring","Year":2014},"Quarter":"summer","RegistrationPeriods":[{"EndDate":"2014-05-21","StartDate":"2014-04-14"},{"EndDate":"2014-06-22","StartDate":"2014-05-22"},{"EndDate":"2014-06-29","StartDate":"2014-06-23"}],"RegistrationServicesStart":"2014-04-07","StudentAccountStart":null,"TimeScheduleConstruction":{"Bothell":false,"Seattle":false,"Tacoma":false},"TimeSchedulePublished":{"Bothell":true,"Seattle":true,"Tacoma":true},"Year":2014}

myuw_mobile/static/css/mobile.less

+9
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,15 @@ body {
634634
.shortTitle { font-family: 'Roboto', sans-serif; font-weight: 400; color: #444 !important; font-size: 16px !important; margin-top: 5px; display: block; }
635635
}
636636

637+
.textbooks-list {
638+
.textbooks-list-item { //font-size:13px;
639+
.simplesquare {display: inline-block; height: .9em; width: .9em; margin-right: 0.3em;}
640+
.textbooks-course-title {display: inline-block;width:38%;/* text-align:right; */}
641+
.textbooks-course-books {font-weight:bold;}
642+
.textbooks-course-required {font-size:12px;font-style: italic;}
643+
}
644+
}
645+
637646
.destination-arrow { position:absolute; top: 50%; right: 0; margin-top:-14px;
638647
.show_textbooks { display:inline-block; width:40px; line-height: 40px; text-align:center; color:#777; }
639648
}

myuw_mobile/static/js/card/textbook.js

+29-22
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ var TextbookCard = {
22
name: 'TextbookCard',
33
dom_target: undefined,
44
term: undefined,
5-
missing_book_error: false,
65

76
render_init: function() {
8-
var term = (TextbookCard.term === undefined) ? 'current' : TextbookCard.term;
9-
WSData.fetch_book_data(term, TextbookCard.render_upon_data, TextbookCard.textbook_error);
10-
WSData.fetch_course_data_for_term(term, TextbookCard.render_upon_data, TextbookCard._render_error);
11-
// may need to add a missing_course_error
7+
if (TextbookCard.term === 'current') {
8+
if (!window.card_display_dates.is_before_eof_7days_of_term) {
9+
$("#TextbookCard").hide();
10+
return;
11+
}
12+
}
13+
14+
WSData.fetch_course_data_for_term(TextbookCard.term, TextbookCard.render_upon_data, TextbookCard.render_error);
15+
WSData.fetch_book_data(TextbookCard.term, TextbookCard.render_upon_data, TextbookCard.textbook_error);
1216
},
1317

1418

@@ -20,38 +24,32 @@ var TextbookCard = {
2024
//If more than one data source, multiple callbacks point to this function
2125
//Delay rendering until all requests are complete
2226
//Do something smart about not showing error if AJAX is pending
23-
if (!TextbookCard._has_all_data()) {
24-
return;
27+
if (TextbookCard._has_all_data()) {
28+
TextbookCard._render();
2529
}
26-
TextbookCard._render();
2730
},
2831

2932
textbook_error: function() {
30-
TextbookCard.missing_book_error = true;
31-
TextbookCard._render_error();
32-
},
33-
34-
_render_error: function() {
35-
if (TextbookCard.missing_book_error) {
36-
}
37-
else {
38-
var source = $("#textbook_card").html();
39-
var template = Handlebars.compile(source);
40-
TextbookCard.dom_target.html(template({'no_books': true,
41-
'term': TextbookCard.term}
42-
));
33+
var book_error_code = WSData.book_data_error_code();
34+
var course_error_code = WSData.course_data_error_code();
35+
if (book_error_code === 404 && (course_error_code === null || course_error_code === 404)) {
36+
$("#TextbookCard").hide();
37+
return;
4338
}
39+
TextbookCard.dom_target.html(CardWithError.render("Textbook"));
4440
},
4541

4642
_render: function () {
4743
var term = TextbookCard.term;
4844
var course_data = WSData.course_data_for_term(term);
45+
var no_book_assigned = true;
4946
var registered = true;
5047
var section_book_data = [];
5148
if (course_data.sections.length === 0) {
5249
registered = false;
5350
} else {
5451
var textbook_data = TextBooks.process_book_data(WSData.book_data(term), course_data);
52+
5553
$.each(textbook_data.sections, function (sec_idx, section) {
5654
var required = 0;
5755
var optional = 0;
@@ -61,18 +59,27 @@ var TextbookCard = {
6159
} else {
6260
optional += 1;
6361
}
62+
if (no_book_assigned) {
63+
no_book_assigned = false;
64+
}
6465
});
6566
var course_id = section.curriculum + " " + section.course_number + " " + section.section_id;
6667

6768
var section_data = {"course_id": course_id,
69+
"color_id": section.color_id,
6870
"required": required,
69-
"optional": optional
71+
"total": required + optional,
72+
"no_course_books": (required + optional) ? false :true
7073
};
7174
section_book_data.push(section_data);
7275
});
7376
}
7477
var template_data = {"registered": registered,
7578
"term": term,
79+
"no_book_assigned": no_book_assigned,
80+
"quarter": course_data.quarter,
81+
"year": course_data.year,
82+
"summer_term": course_data.summer_term,
7683
"sections": section_book_data};
7784

7885
var source = $("#textbook_card").html();

myuw_mobile/static/js/landing.js

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ var Landing = {
2323
RegStatusCard,
2424
SummerRegStatusCardA,
2525
VisualScheduleCard,
26+
TextbookCard,
2627
CourseCard,
2728
HfsCard,
2829
TuitionCard,

myuw_mobile/static/js/myuw_m.js

+3
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,9 @@ var titilizeTerm = function(term) {
354354
//Takes a term string (Eg 2032,summer,b-term) and
355355
//returns a title (Eg Summer 2032 B-term)
356356
var pieces = term.split(",");
357+
if (pieces.length === 1) {
358+
return capitalizeString(string);
359+
}
357360
var string = capitalizeString(pieces[1]) + " " + pieces[0];
358361
if (pieces.length > 2) {
359362
string += " " + capitalizeString(pieces[2]);

myuw_mobile/static/js/ws_data.js

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
WSData = {
22
_book_data: {},
3+
_book_data_error_status: null,
34
_course_data: {},
45
_course_data_error_status: null,
56
_profile_data: null,
@@ -81,6 +82,10 @@ WSData = {
8182
return WSData._book_data[term];
8283
},
8384

85+
book_data_error_code: function() {
86+
return WSData._book_data_error_status;
87+
},
88+
8489
course_data_error_code: function() {
8590
return WSData._course_data_error_status;
8691
},
@@ -250,6 +255,7 @@ WSData = {
250255
WSData._run_success_callbacks_for_url(url);
251256
},
252257
error: function(xhr, status, error) {
258+
WSData._book_data_error_status = xhr.status;
253259
WSData._run_error_callbacks_for_url(url);
254260
}
255261
});

myuw_mobile/templates/handlebars/card/textbook.html

+24-15
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,31 @@
44
<div class="card" data-name="TextbookCard" data-type="card">
55
<div class="fade-in">
66

7-
<h3>Textbooks <!--<span class="shortTitle">{{termNoYear term}}</span>--></h3>
7+
<h3>Textbooks</h3>
88

9-
{{ #if no_books }}
10-
<p class="text-muted">No textbooks for this term</p>
11-
{{ else }}
12-
<ul class="unstyled-list">
13-
{{ #each sections }}
14-
<li>{{ course_id }}: {{ required }} required, {{ optional }} optional</li>
15-
{{ /each }}
16-
</ul>
17-
{{ /if }}
18-
19-
{{#unless no_books}}
20-
<div class="destination-arrow">
21-
<a class="show_textbooks" href="/mobile/textbooks/{{term}}" title="View textbooks"><i class="fa fa-chevron-right"></i></a
22-
</div>
9+
<ul class="unstyled-list textbooks-list">
10+
{{ #each sections }}
11+
<li class="textbooks-list-item">
12+
<div class="c{{color_id}} simplesquare todo"></div>
13+
<span class="textbooks-course-title">{{ course_id }}:</span>
14+
<span class="textbooks-course-books">
15+
{{ #if no_course_books }}
16+
No books
17+
{{else}}
18+
{{ total }} {{ pluralize total 'book' 'books' }}
19+
</span>
20+
<span class="textbooks-course-required">
21+
({{#if required}}{{required}}{{else}}not{{/if}} required)
22+
</span>
23+
</li>
24+
{{ /if }}
25+
{{ /each }}
26+
</ul>
27+
28+
{{#unless no_book_assigned}}
29+
<div class="destination-arrow">
30+
<a class="show_textbooks" href="/mobile/textbooks/{{year}},{{quarter}}{{#if summer_term}},{{toLowerCase summer_term}}{{/if}}" title="View textbooks"><i class="fa fa-chevron-right"></i></a>
31+
</div>
2332
{{/unless}}
2433

2534
</div>

myuw_mobile/templates/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
"is_before_end_of_summer_reg_display_periodA": {{ card_display_dates.is_before_end_of_summer_reg_display_periodA|yesno:"true, false" }},
9393
"is_before_end_of_summer_reg_display_period1": {{ card_display_dates.is_before_end_of_summer_reg_display_period1|yesno:"true, false" }},
9494
"is_before_first_day_of_term": {{ card_display_dates.is_before_first_day_of_term|yesno:"true, false" }},
95+
"is_before_eof_7days_of_term": {{ card_display_dates.is_before_eof_7days_of_term|yesno:"true, false" }},
9596
"last_term": "{{ card_display_dates.last_term }}"
9697
};
9798
</script>

myuw_mobile/test/api/cur_books.py

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from django.test import TestCase
2+
from django.test.client import Client
3+
from django.core.urlresolvers import reverse
4+
from unittest2 import skipIf
5+
from myuw_mobile.test.api import missing_url, get_user, get_user_pass
6+
from django.test.utils import override_settings
7+
import json
8+
9+
@override_settings(RESTCLIENTS_SWS_DAO_CLASS='restclients.dao_implementation.sws.File',
10+
MIDDLEWARE_CLASSES = (
11+
'django.contrib.sessions.middleware.SessionMiddleware',
12+
'django.middleware.common.CommonMiddleware',
13+
'django.middleware.csrf.CsrfViewMiddleware',
14+
'django.contrib.auth.middleware.AuthenticationMiddleware',
15+
'django.contrib.auth.middleware.RemoteUserMiddleware',
16+
'django.contrib.messages.middleware.MessageMiddleware',
17+
'django.middleware.clickjacking.XFrameOptionsMiddleware',
18+
'userservice.user.UserServiceMiddleware',
19+
),
20+
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
21+
)
22+
class TestCurBooks(TestCase):
23+
def setUp(self):
24+
self.client = Client()
25+
26+
@skipIf(missing_url("myuw_current_book"), "myuw_current_book url not configured")
27+
def test_javerage_cur_term_books(self):
28+
url = reverse("myuw_current_book")
29+
get_user('javerage')
30+
self.client.login(username='javerage', password=get_user_pass('javerage'))
31+
response = self.client.get(url)
32+
self.assertEquals(response.status_code, 200)
33+
34+
data = json.loads(response.content)
35+
36+
self.assertEquals(len(data["18545"]), 2)
37+
self.assertEquals(data["verba_link"], "http://uw-seattle.verbacompare.com/m?section_id=AB12345&quarter=spring")
38+
self.assertEquals(data["18545"][0]["cover_image_url"], "www7.bookstore.washington.edu/MyUWImage.taf?isbn=9780878935970&key=46c9ef715edb2ec69517e2c8e6ec9c18")
39+
self.assertEquals(len(data["18545"][0]["authors"]), 1)
40+
self.assertEquals(data["18545"][0]["is_required"], True)
41+
self.assertEquals(data["18545"][0]["price"], None)
42+
self.assertEquals(data["18545"][0]["used_price"], None)
43+
self.assertEquals(data["18545"][0]["isbn"], '9780878935970')
44+
self.assertEquals(data["18545"][0]["notes"], 'required')
45+
46+
@skipIf(missing_url("myuw_current_book"), "myuw_current_book url not configured")
47+
def test_eight_cur_term_books(self):
48+
url = reverse("myuw_current_book")
49+
get_user('eight')
50+
self.client.login(username='eight', password=get_user_pass('eight'))
51+
response = self.client.get(url)
52+
self.assertEquals(response.status_code, 200)
53+
54+
data = json.loads(response.content)
55+
56+
self.assertEquals(len(data["11646"]), 1)
57+
self.assertEquals(data["11646"][0]["cover_image_url"], None)
58+
self.assertEquals(len(data["11646"][0]["authors"]), 1)
59+
self.assertEquals(data["11646"][0]["is_required"], True)
60+
self.assertEquals(data["11646"][0]["price"], 45.0)
61+
self.assertEquals(data["11646"][0]["used_price"], None)
62+
self.assertEquals(data["11646"][0]["isbn"], "9780521600491")
63+
self.assertEquals(data["11646"][0]["notes"], 'required')
64+

0 commit comments

Comments
 (0)