Skip to content

Commit eed61f0

Browse files
author
JAST-KokiWatanabe
committed
1 parent 3c33828 commit eed61f0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+6259
-4394
lines changed

biz/djangoapps/ga_contract_operation/student_member_register.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,9 @@ def _validate(student):
263263
for num in range(17, 27):
264264
if len(input_columns[num]) > 100:
265265
return _fail(_("Please enter of {0} within {1} characters.").format(_("Item"), 100))
266-
if member_code != '':
266+
if member_code:
267+
if not re.match(r'^[ -~]*$', member_code):
268+
return _fail(_("Illegal format on {0}.").format(_("Member Code")))
267269
email = input_columns[1]
268270
members = Member.find_active_by_email(org=contract.contractor_organization.id, email=email).values('code')
269271
code_exist = True if len(Member.find_active_by_code(

biz/djangoapps/ga_contract_operation/tests/test_views_reminder_mail.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def setUp(self):
4848
start=datetime(2016, 1, 1, 0, 0, 0, tzinfo=tzutc()), # must be the past date
4949
self_paced=True,
5050
individual_end_days=10,
51+
deadline_start=datetime(2016, 1, 5, 0, 0, 0, tzinfo=tzutc())
5152
)
5253

5354
self.contract_submission_reminder = self._create_contract(
@@ -296,7 +297,7 @@ def test_mail(self):
296297
ContractReminderMail.MAIL_PARAM_EMAIL_ADDRESS,
297298
ContractReminderMail.MAIL_PARAM_COURSE_NAME,
298299
ContractReminderMail.MAIL_PARAM_FULLNAME,
299-
# ContractReminderMail.MAIL_PARAM_EXPIRE_DATE,
300+
ContractReminderMail.MAIL_PARAM_EXPIRE_DATE,
300301
], search_mail_info['search_mail_params'])
301302
expect_search_detail_other_list = OrderedDict()
302303
expect_search_detail_other_list['login_code'] = "Login Code"
@@ -1375,7 +1376,7 @@ def test_reminder_search_mail_send_ajax(self):
13751376
'email_address': user1.email,
13761377
'fullname': user1.profile.name,
13771378
'course_name': self.course_self_paced1.display_name,
1378-
'expire_date': unicode(self_paced_api.get_course_end_date(enrollment).strftime("%Y-%m-%d")),
1379+
'expire_date': datetime(2016, 1, 5, 0, 0, 0, tzinfo=tzutc()).strftime("%Y-%m-%d"),
13791380
})
13801381

13811382
@ddt.data(True, False)

biz/djangoapps/ga_contract_operation/tests/test_views_students.py

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def _assert_search_ajax_successful(self, data, total, show_list):
6565

6666
def _create_param_search_students_ajax(
6767
self, contract_id=None, offset=0, limit=1000, status='',
68-
is_unregister='contains', member_is_delete='contains', is_masked='contains', group_name='', free_word=''):
68+
is_unregister='contains', member_is_delete='exclude', is_masked='contains', group_name='', free_word=''):
6969
param = {
7070
'contract_id': contract_id or self.contract.id,
7171
'offset': str(offset),
@@ -173,6 +173,7 @@ def test_index_manager(self, param_group_code, expect_num):
173173
self.assertEqual(render_to_response_args[1]['total_count'], expect_num)
174174
self.assertEqual(len(json.loads(render_to_response_args[1]['show_list'])), expect_num)
175175

176+
176177
@ddt.data(0, 1, 10)
177178
def test_search_students_ajax(self, test_num):
178179
self.setup_user()
@@ -394,7 +395,7 @@ def test_students_search_students_ajax_free_word_group_name(self, param_free_wor
394395
data = json.loads(response.content)
395396
self._assert_search_ajax_successful(data, 1, 1)
396397

397-
@ddt.data('exclude', 'only', 'contains')
398+
@ddt.data('', 'exclude', 'only', 'contains')
398399
def test_students_search_students_ajax_is_delete(self, param_is_delete):
399400
self.setup_user()
400401
director_manager = self._director_manager
@@ -406,12 +407,16 @@ def test_students_search_students_ajax_is_delete(self, param_is_delete):
406407
register1 = self._create_user_and_contract_register(username='username_only_delete_target')
407408
self._create_member(org=self.contract_org, group=group, code='code_delete_target_member', user=register1.user,
408409
is_active=False, is_delete=True)
410+
self._create_member(org=self.contract_org, group=group, code='code_delete_target_member_backup', user=register1.user,
411+
is_active=False, is_delete=False)
409412

410413
# Active member
411414
register2 = self._create_user_and_contract_register(username='username_active_and_delete_target')
412415
self._create_member(org=self.contract_org, group=group, code='code_active_member', user=register2.user)
413416
self._create_member(org=self.contract_org, group=group, code='code_active_member_old', user=register2.user,
414417
is_active=False, is_delete=True)
418+
self._create_member(org=self.contract_org, group=group, code='code_active_member_backup', user=register2.user,
419+
is_active=False, is_delete=False)
415420

416421
with self.skip_check_course_selection(current_organization=self.contract_org,
417422
current_contract=self.contract, current_manager=director_manager):
@@ -420,7 +425,7 @@ def test_students_search_students_ajax_is_delete(self, param_is_delete):
420425
self.assertEqual(200, response.status_code)
421426
data = json.loads(response.content)
422427
show_list = json.loads(data['show_list'])
423-
if param_is_delete == 'exclude':
428+
if param_is_delete in ['', 'exclude']:
424429
self._assert_search_ajax_successful(data, 1, 1)
425430
self.assertEqual(show_list[0]['user_name'], 'username_active_and_delete_target')
426431
elif param_is_delete == 'contains':
@@ -433,7 +438,7 @@ def test_students_search_students_ajax_is_delete(self, param_is_delete):
433438
self.assertEqual(show_list[0]['user_name'], 'username_only_delete_target')
434439
self.assertEqual(show_list[1]['user_name'], 'username_active_and_delete_target')
435440

436-
@ddt.data('exclude', 'only', 'contains')
441+
@ddt.data('', 'exclude', 'only', 'contains')
437442
def test_students_search_students_ajax_is_masked(self, param_is_masked):
438443
self.setup_user()
439444
director_manager = self._director_manager
@@ -450,7 +455,7 @@ def test_students_search_students_ajax_is_masked(self, param_is_masked):
450455
self.assertEqual(200, response.status_code)
451456
data = json.loads(response.content)
452457
show_list = json.loads(data['show_list'])
453-
if param_is_masked == 'exclude':
458+
if param_is_masked in ['', 'exclude']:
454459
self._assert_search_ajax_successful(data, 1, 1)
455460
self.assertEqual(show_list[0]['user_name'], 'username_is_not_masked')
456461
elif param_is_masked == 'contains':
@@ -606,12 +611,52 @@ def test_another_organization_member(self):
606611
with self.skip_check_course_selection(current_organization=orgs[1],
607612
current_contract=contracts[1], current_manager=managers[1]):
608613
response = self.client.post(self._url_search_students_ajax, param)
614+
609615
self.assertEqual(200, response.status_code)
610616
data = json.loads(response.content)
611617
show_list = json.loads(data['show_list'])
612618
self._assert_search_ajax_successful(data, 1, 1)
613619
self.assertFalse(hasattr(show_list[0], 'code'))
614620

621+
def test_students_search_users_belonging_multiple_organizations(self):
622+
self.setup_user()
623+
# user1 has member data.
624+
user1 = UserFactory.create()
625+
# user1 has not member data.
626+
user2 = UserFactory.create()
627+
628+
# create two org and contract
629+
orgs = [self._create_organization(org_name='org' + str(i)) for i in range(2)]
630+
contracts = [self._create_contract(contractor_organization=orgs[i]) for i in range(2)]
631+
632+
# create contract register for user1 and user2
633+
contract_registers = []
634+
for _user in [user1, user2]:
635+
for _contract in contracts:
636+
contract_registers.append(self.create_contract_register(user=_user, contract=_contract))
637+
638+
# create member for user1
639+
user1_members = [self._create_member(org=_org, user=user1, group=None, code='code' + str(i)) for i, _org in enumerate(orgs)]
640+
641+
managers = [self._create_manager(org=org, user=self.user, created=self.contract_org,
642+
permissions=[self.director_permission]) for org in orgs]
643+
644+
for i in range(2):
645+
param = self._create_param_search_students_ajax(contract_id=contracts[i].id)
646+
with self.skip_check_course_selection(current_organization=orgs[i],
647+
current_contract=contracts[i], current_manager=managers[i]):
648+
response = self.client.post(self._url_search_students_ajax, param)
649+
650+
self.assertEqual(200, response.status_code)
651+
data = json.loads(response.content)
652+
show_list = json.loads(data['show_list'])
653+
self._assert_search_ajax_successful(data, 2, 2)
654+
for show_item in show_list:
655+
if show_item['user_email'] == user1.email:
656+
self.assertEqual(show_item['code'], user1_members[i].code)
657+
else:
658+
self.assertFalse(show_item['code'])
659+
615660

616661
class ContractOperationViewTestUnregisterStudents(BizContractTestBase):
617662
@property

biz/djangoapps/ga_contract_operation/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def get_additional_info_by_contract(contract):
3030
'caption': additional_info.display_name,
3131
'sortable': True,
3232
'hidden': True,
33-
'size': 1,
33+
'size': 5,
3434
})
3535
display_names.append(additional_info.display_name)
3636

biz/djangoapps/ga_contract_operation/views.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,12 @@ def _students_initial_search(request):
155155

156156

157157
def _contract_register_list_on_page(request, offset=0, limit=CONTRACT_REGISTER_MAX_DISPLAY_NUM):
158-
option_sql = [request.current_organization.id, request.current_contract.id]
158+
option_sql = [
159+
# set default arguments for sql
160+
request.current_organization.id,
161+
request.current_organization.id,
162+
request.current_contract.id
163+
]
159164
where_sql = ""
160165

161166
radio_operator_exclude = 'exclude'
@@ -185,6 +190,7 @@ def _contract_register_list_on_page(request, offset=0, limit=CONTRACT_REGISTER_M
185190
# Status and Unregister
186191
status = request.POST.get('status')
187192
is_unregister = request.POST.get('is_unregister')
193+
# is_unregister is empty when students page initial display.
188194
if is_unregister in radio_operator:
189195
if is_unregister == radio_operator_contains:
190196
if status:
@@ -253,14 +259,17 @@ def _contract_register_list_on_page(request, offset=0, limit=CONTRACT_REGISTER_M
253259
# Target user of delete member
254260
member_is_delete = request.POST.get('member_is_delete')
255261
if member_is_delete == radio_operator_contains:
256-
where_sql += "AND (MG.is_active=1 OR MG.is_delete=0 OR MG.is_active=0 OR MG.is_delete=1 OR MG.is_active IS NULL) "
262+
where_sql += "AND ((MG.is_active=1 AND MG.is_delete=0) OR (MG.is_active=0 AND MG.is_delete=1) OR MG.is_active IS NULL) "
257263
elif member_is_delete == radio_operator_only:
258264
where_sql += "AND MG.is_delete=1 "
259-
elif member_is_delete == radio_operator_exclude:
265+
else:
266+
# member_is_delete in ['', 'exclude']
267+
# member_is_delete is empty when students page initial display.
260268
where_sql += "AND (MG.is_active=1 OR MG.is_active IS NULL) "
261269

262270
# Mask
263271
is_masked = request.POST.get('is_masked')
272+
# is_masked is empty when students page initial display.
264273
if is_masked == radio_operator_exclude:
265274
where_sql += "AND email LIKE %s "
266275
option_sql.append('%@%')
@@ -281,7 +290,7 @@ def _contract_register_list_on_page(request, offset=0, limit=CONTRACT_REGISTER_M
281290
M.org1, M.org2, M.org3, M.org4, M.org5, M.org6, M.org7, M.org8, M.org9, M.org10,
282291
M.item1, M.item2, M.item3, M.item4, M.item5, M.item6, M.item7, M.item8, M.item9, M.item10
283292
FROM gx_member_member as M LEFT OUTER JOIN gx_org_group_group as G
284-
ON M.group_id = G.id AND M.org_id = %s) MG ON IC.user_id = MG.user_id
293+
ON M.group_id = G.id AND M.org_id = %s) MG ON IC.user_id = MG.user_id AND MG.org_id = %s
285294
WHERE IC.contract_id = %s ''' + where_sql + '''
286295
ORDER BY IC.id'''
287296
count_sql = '''SELECT 1 as id, COUNT(*) as cnt FROM (''' + sql + ''') CNT'''
@@ -797,7 +806,7 @@ def reminder_mail(request):
797806
ContractReminderMail.MAIL_PARAM_EMAIL_ADDRESS,
798807
ContractReminderMail.MAIL_PARAM_COURSE_NAME,
799808
ContractReminderMail.MAIL_PARAM_FULLNAME,
800-
# ContractReminderMail.MAIL_PARAM_EXPIRE_DATE,
809+
ContractReminderMail.MAIL_PARAM_EXPIRE_DATE,
801810
],
802811
}
803812

@@ -1306,10 +1315,7 @@ def reminder_search_mail_send_ajax(request):
13061315
except UserProfile.DoesNotExist:
13071316
full_name = ''
13081317
else:
1309-
if course.self_paced:
1310-
expire_datetime = self_paced_api.get_course_end_date(
1311-
CourseEnrollment.get_enrollment(user, detail.course_id)
1312-
)
1318+
expire_datetime = course.deadline_start
13131319
full_name = user.profile.name
13141320

13151321
try:

biz/djangoapps/ga_course_anslist/helpers.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,30 @@
4242
and sbm.course_id = '$course_id'
4343
group by sbm.unit_id
4444
order by sbm.created
45-
'''
45+
'''
46+
47+
QUERY_STATEMENT_SURVEY_NAMES_MAX = '''
48+
SELECT
49+
sbm.id
50+
, sbm.unit_id
51+
, sbm.course_id
52+
, sbm.survey_name
53+
, max(sbm.created)
54+
FROM
55+
ga_survey_surveysubmission as sbm
56+
WHERE 1 = 1
57+
and sbm.course_id = '$course_id'
58+
group by sbm.unit_id
59+
order by sbm.created
60+
'''
4661

47-
def _create_survey_name_list_statement(course_id):
48-
templ = Template(QUERY_STATEMENT_SURVEY_NAMES)
49-
sql_statement = templ.substitute(course_id=course_id)
62+
def _create_survey_name_list_statement(course_id, flg_get_updated_survey_name=False):
63+
if flg_get_updated_survey_name:
64+
templ = Template(QUERY_STATEMENT_SURVEY_NAMES_MAX)
65+
sql_statement = templ.substitute(course_id=course_id)
66+
else:
67+
templ = Template(QUERY_STATEMENT_SURVEY_NAMES)
68+
sql_statement = templ.substitute(course_id=course_id)
5069
return sql_statement
5170

5271

@@ -161,7 +180,7 @@ def _serialize_post_data_for_detail(post_data):
161180

162181
ret_lst = []
163182
for k in ret_dct.keys():
164-
ret_lst.append({'field' : [k], 'value' : ret_dct[k]})
183+
ret_lst.append({'field' : [k], 'value': ret_dct[k]})
165184

166185
return ret_lst
167186

biz/djangoapps/ga_course_anslist/tests/test_helpers.py

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@
5959
and sbm.course_id = '$course_id'
6060
group by sbm.unit_id
6161
order by sbm.created
62-
'''
62+
'''
6363

64-
QUERY_STATEMENT_SURVEY_NAMES_ACTUAL = '''
64+
QUERY_STATEMENT_SURVEY_NAMES_EXPECTED = '''
6565
SELECT
6666
sbm.id
6767
, sbm.unit_id
@@ -74,7 +74,38 @@
7474
and sbm.course_id = 'course-v1:xxxxxxxxxxx+2018_02'
7575
group by sbm.unit_id
7676
order by sbm.created
77-
'''
77+
'''
78+
79+
QUERY_STATEMENT_SURVEY_NAMES_MAX = '''
80+
SELECT
81+
sbm.id
82+
, sbm.unit_id
83+
, sbm.course_id
84+
, sbm.survey_name
85+
, max(sbm.created)
86+
FROM
87+
ga_survey_surveysubmission as sbm
88+
WHERE 1 = 1
89+
and sbm.course_id = '$course_id'
90+
group by sbm.unit_id
91+
order by sbm.created
92+
'''
93+
94+
95+
QUERY_STATEMENT_SURVEY_NAMES_MAX_EXPECTED = '''
96+
SELECT
97+
sbm.id
98+
, sbm.unit_id
99+
, sbm.course_id
100+
, sbm.survey_name
101+
, max(sbm.created)
102+
FROM
103+
ga_survey_surveysubmission as sbm
104+
WHERE 1 = 1
105+
and sbm.course_id = 'course-v1:xxxxxxxxxxx+2018_02'
106+
group by sbm.unit_id
107+
order by sbm.created
108+
'''
78109

79110
QUERY_STATEMENT_USER_NOT_MEMBERS = '''
80111
SELECT
@@ -203,15 +234,29 @@ def test_query_statement_survey_names(self):
203234
self.assertEqual(expected, actual)
204235
log.debug('DONE')
205236

237+
def test_query_statement_survey_names_max(self):
238+
expected = json.dumps(QUERY_STATEMENT_SURVEY_NAMES_MAX)
239+
actual = json.dumps(helper.QUERY_STATEMENT_SURVEY_NAMES_MAX)
240+
self.assertEqual(expected, actual)
241+
log.debug('DONE')
242+
206243
def test_create_survey_name_list_statement(self):
207-
expected = QUERY_STATEMENT_SURVEY_NAMES_ACTUAL
244+
expected = QUERY_STATEMENT_SURVEY_NAMES_EXPECTED
208245
## arrange
209-
org_id = CONST_ORG_ID
210246
course_id = CONST_COURSE_ID
211247
actual = helper._create_survey_name_list_statement(course_id)
212248
self.assertEqual(expected, actual)
213249
log.debug('DONE')
214250

251+
def test_create_survey_name_list_max_statement(self):
252+
expected = QUERY_STATEMENT_SURVEY_NAMES_MAX_EXPECTED
253+
## arrange
254+
course_id = CONST_COURSE_ID
255+
flg_get_updated_survey_name = True
256+
actual = helper._create_survey_name_list_statement(course_id, flg_get_updated_survey_name)
257+
self.assertEqual(expected, actual)
258+
log.debug('DONE')
259+
215260
def test_query_statement_user_nat_members(self):
216261
expected = json.dumps(QUERY_STATEMENT_USER_NOT_MEMBERS)
217262
actual = json.dumps(helper.QUERY_STATEMENT_USER_NOT_MEMBERS)

0 commit comments

Comments
 (0)