parent
90dca506f9
commit
1b533ac437
|
@ -3,8 +3,11 @@ python:
|
|||
- "2.6"
|
||||
- "2.7"
|
||||
install:
|
||||
- pip install git+ssh://git@github.com/openlabs/nereid-activity-stream.git@develop
|
||||
- python setup.py install
|
||||
- pip install flake8
|
||||
script:
|
||||
- python setup.py test
|
||||
- flake8 .
|
||||
|
||||
source_key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb1FJQkFBS0NBUUVBcjQvSjJsYWgwcnBDS1U0VjNsQUVldnZEcTZibld2WWxFak52VG1yWkhoMDBISTJLCllzUHl6NjU5aUh4QzBhTFBRUWVkVjQxeU50N09ybDFPekoxV2VpbDErN01MY3JKZkFQUWdBc2dYSGdPZEdZZFgKM2dOaHpRc0hZVUVpM2dYSlNtSE1oUEpNSFB6L2loeWRKYXhoNCtOaEZHcEFUcWN0L2FaWVFVbnMvV3NBN3FUdApSeUEzdXJVUllJUzZqRXRTckYzNFNlVUpKMWM3Nys2YnNVRXpzYlBZazdXbXRMU0pGb0FoSzdJZnp1eEttcVFnCmhJWDZFTFRUMTRJTE9HdkN2SVp5dlFIUDlxWkhFd1l4bzROZS81c0RURnk4em1EYy9TaXBUR0k2VVJ6ZDhNL0QKSEhhOGRpZG01cmFMMU1oSVpOZjR5eUpLWURpNHdkL1BERkZhSlFJREFRQUJBb0gvZUFMUytXNC9NTTRpYkJuMAoyUVBhRERnT2lraU4zcUJrdHd4eUNpa0FRcFcwQ2RDM3lNd3FMODRZQWpUdmVGN1RUcURsN2ZQREg3OHZpZ0krCjI2Q3lmTS9hMXpTTm50cFFGMWJLaXh3OHNVZkhIS3hvWkZ2cmZ6OEt6SEM2WlF1UGprbE1oWlVjY3JSLyt1bVUKZ3l4VHZuU3c2RU81c2dxV1pjNVFobEVDc0RoU2pyYzVhTEJXaG1GVkdBbTNhZndoNDF1V3FSd0NaY05LNHJNQQpRSnp4Z2R0K25QaGIvZTdjSCtTcG5zbWhBQ3J4N2w3OFJQZDM4bm1zRTZzVEE5QjF5RzcvWnVvTURDWkM2eUxGCnpDeEJuQ2Q5NWJCVlo5THZ6MDc3S1RKbTFCc1VUcWxvdkNpSlpyck16ZG5ZNUJaa1BhSzFES3VQd0dUUXVxNGcKNzBzaEFvR0JBT2FEOFNJWE9RdXZaTEJuUUVQWTZyOTFGamhiK1hWTlYreE9hNFpxSlQzN3h0WWJyN25rTzZkawpCeGZCUVdQM1U1Z1JUenhjVVVkdTZOdDRPbmhQNGdLOVZVTkkxNnJ6bEVzUEM4MTFqeUszSWpCbkNtOUpBdDQxCkszeEJNZUxkemJ3N3VENFl3WHR6TCtoQk4wYXJBU3JBVWZMYTQ4V0xscnRZTmRwQVRsejlBb0dCQU1MNGl5Y3EKTGNKbjR0K01lV2RwTlZwWnEvMVhzQlZONVc3ZGdGTEozanZBZFExN3Uxd01CWWhnNmZ6Mk4xRmRBNUMrL3JSbwpwRUllT01kS1RUUkpQK21MeUM0N1BmZTRMVk93QTU3S2p6ZzJVUzJFZ2oxS24xS3pKbkVjZTVaUTY4ckxhZHErCkg2VWhUQXZEUTgyV0grL1FYcG9sMFYra2JIOXRVOXNIWHc1SkFvR0JBT1RiMWdtTW1OeGJGRkozRUR6TUhiUmIKNE9Xdm11bTFFamZRVzd5bG9iZjZRcHpML0JsSTJWa0ZYRzFmTnpheWxOSURUWEdXRGpRbmp4Um1OMWEvcUpvagpzNFVMeXVNMDFlUDNXalp3SXQzS2lDMGFBQ2dnaXJKbWczZm5ta210QU5lRFN4YUxxWHlSRGQwKzhrdzg5dm1rCjJ6ZUx6bHVRak9RUFhkZ0R4RWxaQW9HQVhZM1RmN1IraHBWQXlOSG9BMVg1Y3VRcVlnTXNpOXgzNWczRklIU2EKL1lMbzU5SmlZZFdtNWZ6UzZqM2U1MXpCZERnaGtjSFFaNldHeXlIOUQ4VENOVGVNazVwN3JwMGlxdEIvdkRjbwpKK253WSszOGJKcWMvcHJXTEZwbGR3aFhURlQwOHpCZGtPZjhUSHlpMFVoakJMaXdYRGtmVVV4ZGYzdWZUQzhxClRua0NnWUJMWVdVSXB0SGNINEJvV1lQdWNIcERtRkJYNm1HN0FETFNFVE4wUFkra1gyUGcxekZJc2VlVExZajAKcUhDeGNBREQwOU82V2FMZGV5RU1yelZsR0FaZVc3Z0paUjJkUS9XVUlKdkNCSEtBY2ErdTBlYk01MzdaMHdlRwpIaVFaN1FlZEFDTmFQUTZORkZ6RGZCWGYwUHQ0OXYzeENuZ1RERy9mZUQzRzJKZSttQT09Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg
|
||||
|
|
197
project.py
197
project.py
|
@ -50,6 +50,7 @@ __metaclass__ = PoolMeta
|
|||
|
||||
calendar.setfirstweekday(calendar.SUNDAY)
|
||||
PROGRESS_STATES = [
|
||||
(None, ''),
|
||||
('Backlog', 'Backlog'),
|
||||
('Planning', 'Planning'),
|
||||
('In Progress', 'In Progress'),
|
||||
|
@ -190,7 +191,7 @@ class ProjectInvitation(ModelSQL, ModelView):
|
|||
|
||||
if request.method == 'POST':
|
||||
subject = '[%s] You have been re-invited to join the project' \
|
||||
% self.project.name
|
||||
% self.project.rec_name
|
||||
email_message = render_email(
|
||||
text_template='project/emails/invite_2_project_text.html',
|
||||
subject=subject, to=self.email,
|
||||
|
@ -377,7 +378,7 @@ class Project:
|
|||
|
||||
value = {
|
||||
'id': self.id,
|
||||
'name': self.name,
|
||||
'name': self.rec_name,
|
||||
'type': self.type,
|
||||
'parent': self.parent and self.parent.id or None,
|
||||
# Task specific
|
||||
|
@ -410,7 +411,7 @@ class Project:
|
|||
rv = {
|
||||
'create_date': self.create_date.isoformat(),
|
||||
'id': self.id,
|
||||
'displayName': self.name,
|
||||
'displayName': self.rec_name,
|
||||
'type': self.type,
|
||||
'objectType': self.__name__,
|
||||
}
|
||||
|
@ -465,23 +466,23 @@ class Project:
|
|||
return vals
|
||||
|
||||
@classmethod
|
||||
def create(cls, values):
|
||||
def create(cls, vlist):
|
||||
'''
|
||||
Create a Project.
|
||||
|
||||
:param values: Values to create project.
|
||||
:param vlist: List of dictionaries of values to create
|
||||
'''
|
||||
if has_request_context():
|
||||
values['created_by'] = request.nereid_user.id
|
||||
if values['type'] == 'task':
|
||||
values.setdefault('participants', [])
|
||||
values['participants'].append(
|
||||
('add', [request.nereid_user.id])
|
||||
)
|
||||
else:
|
||||
# TODO: identify the nereid user through employee
|
||||
pass
|
||||
return super(Project, cls).create(values)
|
||||
for values in vlist:
|
||||
if has_request_context():
|
||||
values['created_by'] = request.nereid_user.id
|
||||
if values['type'] == 'task':
|
||||
values.setdefault('participants', []).append(
|
||||
('add', [request.nereid_user.id])
|
||||
)
|
||||
else:
|
||||
# TODO: identify the nereid user through employee
|
||||
pass
|
||||
return super(Project, cls).create(vlist)
|
||||
|
||||
def can_read(self, user):
|
||||
"""
|
||||
|
@ -594,6 +595,8 @@ class Project:
|
|||
POST will create a new project
|
||||
"""
|
||||
Activity = Pool().get('nereid.activity')
|
||||
Work = Pool().get('timesheet.work')
|
||||
|
||||
if not request.nereid_user.is_project_admin():
|
||||
flash(
|
||||
"Sorry! You are not allowed to create new projects." +
|
||||
|
@ -602,16 +605,19 @@ class Project:
|
|||
return redirect(request.referrer)
|
||||
|
||||
if request.method == 'POST':
|
||||
project = cls.create({
|
||||
'name': request.form['name'],
|
||||
project, = cls.create([{
|
||||
'work': Work.create([{
|
||||
'name': request.form['name'],
|
||||
'company': request.nereid_website.company.id,
|
||||
}])[0].id,
|
||||
'type': 'project',
|
||||
})
|
||||
Activity.create({
|
||||
}])
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work, %d' % project.id,
|
||||
'verb': 'created_project',
|
||||
'project': project.id,
|
||||
})
|
||||
}])
|
||||
flash("Project successfully created.")
|
||||
return redirect(
|
||||
url_for('project.work.render_project', project_id=project.id)
|
||||
|
@ -628,6 +634,7 @@ class Project:
|
|||
"""
|
||||
NereidUser = Pool().get('nereid.user')
|
||||
Activity = Pool().get('nereid.activity')
|
||||
Work = Pool().get('timesheet.work')
|
||||
|
||||
project = self.get_project(self.id)
|
||||
|
||||
|
@ -641,7 +648,10 @@ class Project:
|
|||
name = request.form['name']
|
||||
data = {
|
||||
'parent': self.id,
|
||||
'name': name,
|
||||
'work': Work.create([{
|
||||
'name': name,
|
||||
'company': request.nereid_website.company.id
|
||||
}])[0].id,
|
||||
'type': 'task',
|
||||
'comment': request.form.get('description', None),
|
||||
'tags': [('set', request.form.getlist('tags', int))]
|
||||
|
@ -658,14 +668,14 @@ class Project:
|
|||
data['constraint_finish_time'] = datetime.strptime(
|
||||
constraint_finish_time, '%m/%d/%Y')
|
||||
|
||||
task = self.create(data)
|
||||
Activity.create({
|
||||
task, = self.create([data])
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work, %d' % task.id,
|
||||
'verb': 'created_task',
|
||||
'target': 'project.work, %d' % project.id,
|
||||
'project': project.id,
|
||||
})
|
||||
}])
|
||||
|
||||
email_receivers = [p.email for p in self.all_participants]
|
||||
if request.form.get('assign_to', None):
|
||||
|
@ -680,7 +690,7 @@ class Project:
|
|||
task.send_mail(email_receivers)
|
||||
if request.is_xhr:
|
||||
return jsonify(task.serialize())
|
||||
flash("Task successfully added to project %s" % self.name)
|
||||
flash("Task successfully added to project %s" % self.rec_name)
|
||||
return redirect(
|
||||
url_for(
|
||||
'project.work.render_task',
|
||||
|
@ -697,23 +707,27 @@ class Project:
|
|||
Edit the task
|
||||
"""
|
||||
Activity = Pool().get('nereid.activity')
|
||||
Work = Pool().get('timesheet.work')
|
||||
|
||||
task = self.get_task(self.id)
|
||||
|
||||
self.write([task], {
|
||||
Work.write([task.work], {
|
||||
'name': request.form.get('name'),
|
||||
})
|
||||
self.write([task], {
|
||||
'comment': request.form.get('comment')
|
||||
})
|
||||
Activity.create({
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work, %d' % task.id,
|
||||
'verb': 'edited_task',
|
||||
'target': 'project.work, %d' % task.parent.id,
|
||||
'project': task.parent.id,
|
||||
})
|
||||
}])
|
||||
if request.is_xhr:
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'name': self.name,
|
||||
'name': self.rec_name,
|
||||
'comment': self.comment,
|
||||
})
|
||||
return redirect(request.referrer)
|
||||
|
@ -724,7 +738,7 @@ class Project:
|
|||
:param receivers: Receivers of email.
|
||||
"""
|
||||
subject = "[#%s %s] - %s" % (
|
||||
self.id, self.parent.name, self.name
|
||||
self.id, self.parent.rec_name, self.rec_name
|
||||
)
|
||||
|
||||
if not receivers:
|
||||
|
@ -743,7 +757,7 @@ class Project:
|
|||
text_template='project/emails/project_text_content.jinja',
|
||||
html_template='project/emails/project_html_content.jinja',
|
||||
task=self,
|
||||
updated_by=request.nereid_user.name
|
||||
updated_by=request.nereid_user.display_name
|
||||
)
|
||||
|
||||
#Send mail.
|
||||
|
@ -846,7 +860,7 @@ class Project:
|
|||
], limit=1)
|
||||
|
||||
subject = '[%s] You have been invited to join the project' \
|
||||
% project.name
|
||||
% project.rec_name
|
||||
if existing_user:
|
||||
# If participant already existed
|
||||
if existing_user[0] in project.participants:
|
||||
|
@ -865,20 +879,20 @@ class Project:
|
|||
'participants': [('add', [existing_user[0].id])]
|
||||
}
|
||||
)
|
||||
Activity.create({
|
||||
Activity.create([{
|
||||
'actor': existing_user[0].id,
|
||||
'object_': 'project.work, %d' % project.id,
|
||||
'verb': 'joined_project',
|
||||
'project': project.id,
|
||||
})
|
||||
}])
|
||||
flash_message = "%s has been invited to the project" \
|
||||
% existing_user[0].display_name
|
||||
|
||||
else:
|
||||
new_invite = ProjectInvitation.create({
|
||||
new_invite, = ProjectInvitation.create([{
|
||||
'email': email,
|
||||
'project': project.id,
|
||||
})
|
||||
}])
|
||||
email_message = render_email(
|
||||
text_template='project/emails/invite_2_project_text.html',
|
||||
subject=subject, to=email, from_email=CONFIG['smtp_from'],
|
||||
|
@ -934,13 +948,13 @@ class Project:
|
|||
records_to_update_ids
|
||||
), {'participants': [('unlink', [participant_id])]}
|
||||
)
|
||||
Activity.create({
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'nereid.user, %d' % participant_id,
|
||||
'target': 'project.work, %d' % self.id,
|
||||
'verb': 'removed_participant',
|
||||
'project': self.id,
|
||||
})
|
||||
}])
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
|
@ -969,7 +983,7 @@ class Project:
|
|||
# This search is probably the suckiest search in the
|
||||
# history of mankind in terms of scalability and utility
|
||||
# TODO: Figure out something better
|
||||
filter_domain.append(('name', 'ilike', '%%%s%%' % query))
|
||||
filter_domain.append(('work.name', 'ilike', '%%%s%%' % query))
|
||||
|
||||
tag = request.args.get('tag', None, int)
|
||||
if tag:
|
||||
|
@ -1028,7 +1042,7 @@ class Project:
|
|||
# This search is probably the suckiest search in the
|
||||
# history of mankind in terms of scalability and utility
|
||||
# TODO: Figure out something better
|
||||
filter_domain.append(('name', 'ilike', '%%%s%%' % query))
|
||||
filter_domain.append(('work.name', 'ilike', '%%%s%%' % query))
|
||||
|
||||
tag = request.args.get('tag', None, int)
|
||||
if tag:
|
||||
|
@ -1070,12 +1084,12 @@ class Project:
|
|||
task = cls.get_task(task_id)
|
||||
|
||||
comments = sorted(
|
||||
task.history + task.timesheet_lines + task.attachments +
|
||||
task.history + task.work.timesheet_lines + task.attachments +
|
||||
task.repo_commits, key=lambda x: x.create_date
|
||||
)
|
||||
|
||||
hours = {}
|
||||
for line in task.timesheet_lines:
|
||||
for line in task.work.timesheet_lines:
|
||||
hours[line.employee] = hours.setdefault(line.employee, 0) + \
|
||||
line.hours
|
||||
|
||||
|
@ -1259,7 +1273,10 @@ class Project:
|
|||
'project/work-week.jinja', data_by_week=hours_by_week_employee,
|
||||
total_by_employee=total_by_employee
|
||||
)
|
||||
return jsonify(day_totals=day_totals, lines=[], work_week=work_week)
|
||||
return jsonify(
|
||||
day_totals=day_totals, lines=[],
|
||||
work_week=unicode(work_week)
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@login_required
|
||||
|
@ -1572,7 +1589,7 @@ class Project:
|
|||
def to_event(task, type="constraint"):
|
||||
event = {
|
||||
'id': task.id,
|
||||
'title': task.name,
|
||||
'title': task.rec_name,
|
||||
'url': url_for(
|
||||
'project.work.render_task',
|
||||
project_id=task.parent.id, task_id=task.id),
|
||||
|
@ -1687,14 +1704,14 @@ class Project:
|
|||
'type': 'data'
|
||||
})
|
||||
|
||||
Attachment.create(data)
|
||||
Attachment.create([data])
|
||||
|
||||
if request.is_xhr:
|
||||
return jsonify({
|
||||
'success': True
|
||||
})
|
||||
|
||||
flash("Attachment added to %s" % work.name)
|
||||
flash("Attachment added to %s" % work.rec_name)
|
||||
return redirect(request.referrer)
|
||||
|
||||
@classmethod
|
||||
|
@ -1752,17 +1769,17 @@ class Project:
|
|||
# just create comment since nothing really changed since this
|
||||
# update. This is to cover to cover cases where two users who
|
||||
# havent refreshed the web page close the ticket
|
||||
comment = History.create(history_data)
|
||||
comment, = History.create([history_data])
|
||||
else:
|
||||
# Just comment, no update to task
|
||||
comment = History.create(history_data)
|
||||
Activity.create({
|
||||
comment, = History.create([history_data])
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work.history, %d' % comment.id,
|
||||
'verb': 'updated_task',
|
||||
'target': 'project.work, %d' % task.id,
|
||||
'project': task.parent.id,
|
||||
})
|
||||
}])
|
||||
|
||||
if request.nereid_user.id not in current_participant_ids:
|
||||
# Add the user to the participants if not already in the list
|
||||
|
@ -1781,18 +1798,18 @@ class Project:
|
|||
|
||||
hours = request.form.get('hours', None, type=float)
|
||||
if hours and request.nereid_user.employee:
|
||||
timesheet_line = TimesheetLine.create({
|
||||
timesheet_line, = TimesheetLine.create([{
|
||||
'employee': request.nereid_user.employee.id,
|
||||
'hours': hours,
|
||||
'work': task.work.id
|
||||
})
|
||||
Activity.create({
|
||||
}])
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'timesheet.line, %d' % timesheet_line.id,
|
||||
'verb': 'reported_time',
|
||||
'target': 'project.work, %d' % task.id,
|
||||
'project': task.parent.id,
|
||||
})
|
||||
}])
|
||||
|
||||
# Send the email since all thats required is done
|
||||
comment.send_mail()
|
||||
|
@ -1802,7 +1819,7 @@ class Project:
|
|||
'project/comment.jinja', comment=comment)
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'html': html,
|
||||
'html': unicode(html),
|
||||
'state': task.state,
|
||||
'progress_state': task.progress_state,
|
||||
'comment': comment._json(),
|
||||
|
@ -1824,16 +1841,16 @@ class Project:
|
|||
cls.write(
|
||||
[task], {'tags': [('add', [tag_id])]}
|
||||
)
|
||||
Activity.create({
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work.tag, %d' % tag_id,
|
||||
'verb': 'added_tag_to_task',
|
||||
'target': 'project.work, %d' % task.id,
|
||||
'project': task.parent.id,
|
||||
})
|
||||
}])
|
||||
|
||||
if request.method == 'POST':
|
||||
flash('Tag added to task %s' % task.name)
|
||||
flash('Tag added to task %s' % task.rec_name)
|
||||
return redirect(request.referrer)
|
||||
|
||||
flash("Tag cannot be added")
|
||||
|
@ -1854,16 +1871,16 @@ class Project:
|
|||
cls.write(
|
||||
[task], {'tags': [('unlink', [tag_id])]}
|
||||
)
|
||||
Activity.create({
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work, %d' % task.id,
|
||||
'verb': 'removed_tag_from_task',
|
||||
'target': 'project.work, %d' % task.parent.id,
|
||||
'project': task.parent.id,
|
||||
})
|
||||
}])
|
||||
|
||||
if request.method == 'POST':
|
||||
flash('Tag removed from task %s' % task.name)
|
||||
flash('Tag removed from task %s' % task.rec_name)
|
||||
return redirect(request.referrer)
|
||||
|
||||
flash("Tag cannot be removed")
|
||||
|
@ -1874,7 +1891,7 @@ class Project:
|
|||
"""
|
||||
Update write to historize everytime an update is made
|
||||
|
||||
:param ids: ids of the projects
|
||||
:param projects: List of active records of projects
|
||||
:param values: A dictionary
|
||||
"""
|
||||
WorkHistory = Pool().get('project.work.history')
|
||||
|
@ -1901,13 +1918,13 @@ class Project:
|
|||
task = cls.get_task(task_id)
|
||||
|
||||
with Transaction().set_user(0):
|
||||
TimesheetLine.create({
|
||||
TimesheetLine.create([{
|
||||
'employee': request.nereid_user.employee.id,
|
||||
'hours': request.form['hours'],
|
||||
'work': task.work.id,
|
||||
})
|
||||
}])
|
||||
|
||||
flash("Time has been marked on task %s" % task.name)
|
||||
flash("Time has been marked on task %s" % task.rec_name)
|
||||
return redirect(request.referrer)
|
||||
|
||||
@classmethod
|
||||
|
@ -1926,7 +1943,7 @@ class Project:
|
|||
new_assignee = NereidUser(int(request.form['user']))
|
||||
|
||||
if task.assigned_to == new_assignee:
|
||||
flash("Task already assigned to %s" % new_assignee.name)
|
||||
flash("Task already assigned to %s" % new_assignee.display_name)
|
||||
return redirect(request.referrer)
|
||||
if task.parent.can_write(new_assignee):
|
||||
cls.write([task], {
|
||||
|
@ -1934,18 +1951,18 @@ class Project:
|
|||
'participants': [('add', [new_assignee.id])]
|
||||
})
|
||||
task.history[-1].send_mail()
|
||||
Activity.create({
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work, %d' % task.id,
|
||||
'verb': 'assigned_task_to',
|
||||
'target': 'nereid.user, %d' % new_assignee.id,
|
||||
'project': task.parent.id,
|
||||
})
|
||||
}])
|
||||
if request.is_xhr:
|
||||
return jsonify({
|
||||
'success': True,
|
||||
})
|
||||
flash("Task assigned to %s" % new_assignee.name)
|
||||
flash("Task assigned to %s" % new_assignee.display_name)
|
||||
return redirect(request.referrer)
|
||||
flash("Only employees can be assigned to tasks.")
|
||||
return redirect(request.referrer)
|
||||
|
@ -1960,7 +1977,7 @@ class Project:
|
|||
task = cls.get_task(task_id)
|
||||
|
||||
cls.write([task], {
|
||||
'assigned_to': False
|
||||
'assigned_to': None
|
||||
})
|
||||
|
||||
if request.is_xhr:
|
||||
|
@ -1997,12 +2014,12 @@ class Project:
|
|||
constraint_finish, '%m/%d/%Y')
|
||||
|
||||
cls.write([task], data)
|
||||
Activity.create({
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work, %d' % task.id,
|
||||
'verb': 'changed_date',
|
||||
'project': task.parent.id,
|
||||
})
|
||||
}])
|
||||
|
||||
if request.is_xhr:
|
||||
return jsonify({
|
||||
|
@ -2138,18 +2155,18 @@ class Tag(ModelSQL, ModelView):
|
|||
return redirect(request.referrer)
|
||||
|
||||
if request.method == 'POST':
|
||||
tag = cls.create({
|
||||
tag, = cls.create([{
|
||||
'name': request.form['name'],
|
||||
'color': request.form['color'],
|
||||
'project': project.id
|
||||
})
|
||||
Activity.create({
|
||||
}])
|
||||
Activity.create([{
|
||||
'actor': request.nereid_user.id,
|
||||
'object_': 'project.work.tag, %d' % tag.id,
|
||||
'verb': 'created_tag',
|
||||
'target': 'project.work, %d' % project.id,
|
||||
'project': project.id,
|
||||
})
|
||||
}])
|
||||
|
||||
flash("Successfully created tag")
|
||||
return redirect(request.referrer)
|
||||
|
@ -2225,11 +2242,13 @@ class ProjectHistory(ModelSQL, ModelView):
|
|||
updated_by = fields.Many2One('nereid.user', 'Updated By')
|
||||
# States
|
||||
previous_state = fields.Selection([
|
||||
(None, ''),
|
||||
('opened', 'Opened'),
|
||||
('done', 'Done'),
|
||||
], 'Prev. State', select=True
|
||||
)
|
||||
new_state = fields.Selection([
|
||||
(None, ''),
|
||||
('opened', 'Opened'),
|
||||
('done', 'Done'),
|
||||
], 'New State', select=True
|
||||
|
@ -2315,7 +2334,7 @@ class ProjectHistory(ModelSQL, ModelView):
|
|||
# if an employee made the update
|
||||
pass
|
||||
data['project'] = project.id
|
||||
return cls.create(data)
|
||||
return cls.create([data])
|
||||
|
||||
@login_required
|
||||
def update_comment(self, task_id):
|
||||
|
@ -2341,7 +2360,7 @@ class ProjectHistory(ModelSQL, ModelView):
|
|||
html = render_template('project/comment.jinja', comment=self)
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'html': html,
|
||||
'html': unicode(html),
|
||||
'state': task.state,
|
||||
})
|
||||
return redirect(request.referrer)
|
||||
|
@ -2360,7 +2379,7 @@ class ProjectHistory(ModelSQL, ModelView):
|
|||
|
||||
# Prepare the content of email.
|
||||
subject = "[#%s %s] - %s" % (
|
||||
self.project.id, self.project.parent.name,
|
||||
self.project.id, self.project.parent.rec_name,
|
||||
self.project.work.name,
|
||||
)
|
||||
|
||||
|
@ -2454,7 +2473,7 @@ class ProjectWorkCommit(ModelSQL, ModelView):
|
|||
])
|
||||
if commit_hook:
|
||||
continue
|
||||
commit = cls.create({
|
||||
commit, = cls.create([{
|
||||
'commit_timestamp': commit_timestamp,
|
||||
'project': project,
|
||||
'nereid_user': nereid_users[0].id,
|
||||
|
@ -2463,14 +2482,14 @@ class ProjectWorkCommit(ModelSQL, ModelView):
|
|||
'commit_message': commit['message'],
|
||||
'commit_url': commit['url'],
|
||||
'commit_id': commit['id']
|
||||
})
|
||||
Activity.create({
|
||||
}])
|
||||
Activity.create([{
|
||||
'actor': nereid_users[0].id,
|
||||
'object_': 'project.work.commit, %d' % commit.id,
|
||||
'verb': 'made_commit',
|
||||
'target': 'project.work, %d' % project.id,
|
||||
'project': project.parent.id,
|
||||
})
|
||||
}])
|
||||
return 'OK'
|
||||
|
||||
def _json(self):
|
||||
|
@ -2523,7 +2542,7 @@ class ProjectWorkCommit(ModelSQL, ModelView):
|
|||
commit_timestamp = local_commit_time.astimezone(
|
||||
dateutil.tz.tzutc()
|
||||
)
|
||||
cls.create({
|
||||
cls.create([{
|
||||
'commit_timestamp': commit_timestamp,
|
||||
'project': project,
|
||||
'nereid_user': nereid_users[0].id,
|
||||
|
@ -2540,7 +2559,7 @@ class ProjectWorkCommit(ModelSQL, ModelView):
|
|||
commit['raw_node']
|
||||
),
|
||||
'commit_id': commit['raw_node']
|
||||
})
|
||||
}])
|
||||
return 'OK'
|
||||
|
||||
|
||||
|
@ -2588,7 +2607,7 @@ def invitation_new_user_handler(nereid_user_id):
|
|||
nereid_user = NereidUser(nereid_user_id)
|
||||
|
||||
subject = '[%s] %s Accepted the invitation to join the project' \
|
||||
% (invitation.project.name, nereid_user.display_name)
|
||||
% (invitation.project.rec_name, nereid_user.display_name)
|
||||
|
||||
receivers = [
|
||||
p.email for p in invitation.project.company.project_admins if p.email
|
||||
|
@ -2608,12 +2627,12 @@ def invitation_new_user_handler(nereid_user_id):
|
|||
'participants': [('add', [nereid_user_id])]
|
||||
}
|
||||
)
|
||||
Activity.create({
|
||||
Activity.create([{
|
||||
'actor': nereid_user_id,
|
||||
'object_': 'project.work, %d' % invitation.project.id,
|
||||
'verb': 'joined_project',
|
||||
'project': invitation.project.id,
|
||||
})
|
||||
}])
|
||||
|
||||
|
||||
class TimesheetLine:
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
{% else %}
|
||||
<div class="btn-group pull-right">
|
||||
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="icon-user"></i> {{ request.nereid_user.name }}
|
||||
<i class="icon-user"></i> {{ request.nereid_user.display_name }}
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
|
|
|
@ -38,7 +38,7 @@ $(document).ready(function(){
|
|||
</li>
|
||||
{% for project in projects %}
|
||||
<li>
|
||||
<a href="{{ url_for('project.work.render_project', project_id=project.id) }}"><i class="icon-tasks"></i> {{ project.name }}</a>
|
||||
<a href="{{ url_for('project.work.render_project', project_id=project.id) }}"><i class="icon-tasks"></i> {{ project.rec_name }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
||||
|
@ -48,7 +48,7 @@ $(document).ready(function(){
|
|||
</li>
|
||||
{% for task in tasks %}
|
||||
<li>
|
||||
<a href="#"><i class="icon-tasks"></i> {{ task.name }}</a>
|
||||
<a href="#"><i class="icon-tasks"></i> {{ task.rec_name }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<tr>
|
||||
<td>
|
||||
<a class="task-name" href="{{ url_for('project.work.render_task', project_id=task.parent.id, task_id=task.id) }}" rel="tooltip" title="created by {{ task.created_by.display_name }}">
|
||||
<span class="muted">#{{ task.id }}</span> {{ task.name|truncate(50) }}
|
||||
<span class="muted">#{{ task.id }}</span> {{ task.rec_name|truncate(50) }}
|
||||
</a>
|
||||
<a class="icon-tag add-tags" title="Add Tag" rel="popover" data-placement="bottom" data-html="true" data-animation="true" data-content='
|
||||
{% for new_tag in task.parent.tags_for_projects %}
|
||||
|
@ -68,10 +68,10 @@
|
|||
<tr>
|
||||
<td class="task-footer" colspan="2">
|
||||
{% if assigned_to_picture and task.assigned_to %}
|
||||
<img title="{{ task.assigned_to.name }}" src="{{ task.assigned_to.get_profile_picture(size="20", https=True) }}" class="img-circle">
|
||||
<img title="{{ task.assigned_to.display_name }}" src="{{ task.assigned_to.get_profile_picture(size="20", https=True) }}" class="img-circle">
|
||||
{% endif %}
|
||||
{% if show_project_tag %}
|
||||
<span class="label">{{ task.parent and task.parent.name or '' }}</span>
|
||||
<span class="label">{{ task.parent and task.parent.rec_name or '' }}</span>
|
||||
{% endif %}
|
||||
{% if task.point_estimation %}
|
||||
<span class="size icon pull-right" title="Size">{{ task.point_estimation }}</span>
|
||||
|
@ -96,10 +96,10 @@
|
|||
<tr>
|
||||
<td>
|
||||
{% if assigned_to_picture and task.assigned_to %}
|
||||
<img title="{{ task.assigned_to.name }}" src="{{ task.assigned_to.get_profile_picture(size="20", https=True) }}" class="img-circle">
|
||||
<img title="{{ task.assigned_to.display_name }}" src="{{ task.assigned_to.get_profile_picture(size="20", https=True) }}" class="img-circle">
|
||||
{% endif %}
|
||||
{% if show_project_tag %}
|
||||
<span class="label">{{ task.parent and task.parent.name or '' }}</span>
|
||||
<span class="label">{{ task.parent and task.parent.rec_name or '' }}</span>
|
||||
{% endif %}
|
||||
{% if task.point_estimation %}
|
||||
<span class="size icon pull-right" title="Size">{{ task.point_estimation }}</span>
|
||||
|
@ -111,7 +111,7 @@
|
|||
<a href="{{ url_for('project.work.render_task', project_id=task.parent.id, task_id=task.id) }}" class="icon icon-comments-alt pull-right">{{ task.history|length }}</a>
|
||||
|
||||
<a class="task-name" href="{{ url_for('project.work.render_task', project_id=task.parent.id, task_id=task.id) }}" rel="tooltip" title="created by {{ task.created_by.display_name }}">
|
||||
<span class="muted">#{{ task.id }}</span> {{ task.name|truncate(70) }}
|
||||
<span class="muted">#{{ task.id }}</span> {{ task.rec_name|truncate(70) }}
|
||||
</a>
|
||||
<a class="icon-tag add-tags" title="Add Tag" rel="popover" data-placement="bottom" data-html="true" data-animation="true" data-content='
|
||||
{% for new_tag in task.parent.tags_for_projects %}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<i class="icon-time"></i>
|
||||
<strong>{{ line.employee.name }}</strong> worked for <strong>{{ line.hours|float_to_time }}</strong> on <strong>{{ line.date|dateformat('long') }}</strong>
|
||||
{% if related_task %}
|
||||
on <strong><a href="{{ url_for('project.work.render_task', task_id=related_task.id, project_id=related_task.parent.id) }}">{{ related_task.name }}</a></strong>
|
||||
on <strong><a href="{{ url_for('project.work.render_task', task_id=related_task.id, project_id=related_task.parent.id) }}">{{ related_task.rec_name }}</a></strong>
|
||||
{% endif %}
|
||||
<small class="pull-right">
|
||||
<abbr class="timeago" title="{{ request.nereid_user.aslocaltime(line.create_date) }}">{{ request.nereid_user.aslocaltime(line.create_date) }}</abbr>
|
||||
|
|
|
@ -15,7 +15,7 @@ REPLY ABOVE THIS LINE TO POST AN ANSWER
|
|||
<div style="width:100%; height:auto; padding:10px 0px 20px 0px ;border-bottom:solid 1px #C0C0C0">
|
||||
<div style=" float:left; width:auto;">
|
||||
<b>Project </b><a href="{{ url_for('project.work.render_project', project_id=history.project.parent.id, _external=True) }}"
|
||||
style=' text-decoration:none; color:#2E9AFE'> {{ history.project.parent.name }} </a> →
|
||||
style=' text-decoration:none; color:#2E9AFE'> {{ history.project.parent.rec_name }} </a> →
|
||||
<b>Task </b><a href="{{ url_for('project.work.render_task', task_id=history.project.work.id, project_id=history.project.parent.id, _external=True) }}"
|
||||
style=' text-decoration:none; color:#2E9AFE'> {{ history.project.work.name }} </a>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Howdy, {{ user.display_name }},
|
||||
|
||||
You have been invited to collaborate on Project **{{ project.name }}**
|
||||
You have been invited to collaborate on Project **{{ project.rec_name }}**
|
||||
|
||||
Please login to you existing My Openlabs Account to start collaborating.
|
||||
Your email for login is {{ user.email }}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Howdy, friend,
|
||||
|
||||
You have been invited to collaborate on Project **{{ project.name }}**
|
||||
You have been invited to collaborate on Project **{{ project.rec_name }}**
|
||||
|
||||
Please click on the link below to join the project.
|
||||
{{ url_for('nereid.user.registration', _external=True) }}?invitation_code={{ invitation.invitation_code }}
|
||||
|
|
|
@ -13,9 +13,9 @@ REPLY ABOVE THIS LINE TO POST AN ANSWER
|
|||
<div style="width:100%; height:auto; padding:10px 0px 20px 0px ;border-bottom:solid 1px #C0C0C0">
|
||||
<div style=" float:left; width:auto;">
|
||||
<b>Project </b><a href="{{ url_for('project.work.render_project', project_id=task.parent.id, _external=True) }}"
|
||||
style=' text-decoration:none; color:#2E9AFE'> {{ task.parent.name }} </a> →
|
||||
style=' text-decoration:none; color:#2E9AFE'> {{ task.parent.rec_name }} </a> →
|
||||
<b>Task </b><a href="{{ url_for('project.work.render_task', task_id=task.id, project_id=task.parent.id, _external=True) }}"
|
||||
style=' text-decoration:none; color:#2E9AFE'> {{ task.name }} </a>
|
||||
style=' text-decoration:none; color:#2E9AFE'> {{ task.rec_name }} </a>
|
||||
</div>
|
||||
<div style=" float:right; width:auto;">
|
||||
<span style="text-align:right">{{ task.create_date|dateformat }}</span>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
-----------------------------==-----------------------------
|
||||
REPLY ABOVE THIS LINE TO POST AN ANSWER
|
||||
|
||||
Project {{ task.parent.name }}
|
||||
Task {{ task.name }} {{ task.create_date|dateformat }}
|
||||
Project {{ task.parent.rec_name }}
|
||||
Task {{ task.rec_name }} {{ task.create_date|dateformat }}
|
||||
|
||||
A new task is created by {{ updated_by }}.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
-----------------------------==-----------------------------
|
||||
REPLY ABOVE THIS LINE TO POST AN ANSWER
|
||||
|
||||
Task {{ history.project.name }}
|
||||
Task {{ history.project.rec_name }}
|
||||
{% if history.new_assigned_to.name %}
|
||||
Assigned to {{ history.new_assigned_to.name }}
|
||||
{%- endif -%}
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<div class="row-fluid">
|
||||
<div class="span12">
|
||||
<div class="page-header">
|
||||
<h3>Project files<small> related to {{ project.name }}</small></h3>
|
||||
<h3>Project files<small> related to {{ project.rec_name }}</small></h3>
|
||||
</div>
|
||||
<table class="table table-striped table-bordered">
|
||||
<thead>
|
||||
|
@ -66,7 +66,7 @@
|
|||
<td>#{{ attachment.id }}</td>
|
||||
<td><strong>{{ attachment.name }}</strong> ({{ guess_type(attachment.name, False)[0] }})</td>
|
||||
<td>
|
||||
<a href="{{ url_for('project.work.render_task', task_id=task.id, project_id=task.parent.id) }}">#{{ task.id }}: {{ task.name }}</a>
|
||||
<a href="{{ url_for('project.work.render_task', task_id=task.id, project_id=task.parent.id) }}">#{{ task.id }}: {{ task.rec_name }}</a>
|
||||
</td>
|
||||
<td>{{ attachment.description or _('No Description') }}</td>
|
||||
{% if attachment.type == 'data' %}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<ul class="nav nav-tabs nav-stacked">
|
||||
{% for project in projects %}
|
||||
<li>
|
||||
<a href="{{ url_for('project.work.render_project', project_id=project.id) }}"><i class="icon-tasks"></i> {{ project.name }}</a>
|
||||
<a href="{{ url_for('project.work.render_project', project_id=project.id) }}"><i class="icon-tasks"></i> {{ project.rec_name }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
{% block main %}
|
||||
<div class="span12">
|
||||
<div class="page-header">
|
||||
<h3>Project files<small> related to {{ project.name }}</small></h3>
|
||||
<h3>Project files<small> related to {{ project.rec_name }}</small></h3>
|
||||
</div>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
|
@ -64,7 +64,7 @@
|
|||
<td>#{{ attachment.id }}</td>
|
||||
<td><strong>{{ attachment.name }}</strong> ({{ guess_type(attachment.name, False)[0] }})</td>
|
||||
<td>
|
||||
<a href="{{ url_for('project.work.render_task', task_id=task.id, project_id=task.parent.id) }}">#{{ task.id }}: {{ task.name }}</a>
|
||||
<a href="{{ url_for('project.work.render_task', task_id=task.id, project_id=task.parent.id) }}">#{{ task.id }}: {{ task.rec_name }}</a>
|
||||
</td>
|
||||
<td>{{ attachment.description or _('No Description') }}</td>
|
||||
{% if attachment.type == 'data' %}
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
{% endblock %}
|
||||
|
||||
{% block title %}
|
||||
{{ _("Project: ") + project.name }}
|
||||
{{ _("Project: ") + project.rec_name }}
|
||||
{% endblock %}
|
||||
|
||||
{% block left %}
|
||||
|
|
|
@ -8,11 +8,11 @@
|
|||
<li class="divider">/</li>
|
||||
<li><a href="{{ url_for('project.work.render_task_list', project_id=project.id) }}">{{ _('Tasks') }}</a></li>
|
||||
<li class="divider">/</li>
|
||||
<li><a href="{{ url_for('project.work.render_task', project_id=project.id, task_id=task.id) }}">{{ task.name }}</a></li>
|
||||
<li><a href="{{ url_for('project.work.render_task', project_id=project.id, task_id=task.id) }}">{{ task.rec_name }}</a></li>
|
||||
{% endblock %}
|
||||
|
||||
{% block title %}
|
||||
{{ _("Task #%d: " % task.id) + task.name }}
|
||||
{{ _("Task #%d: " % task.id) + task.rec_name }}
|
||||
{% endblock %}
|
||||
|
||||
{% block left %}
|
||||
|
@ -257,7 +257,7 @@
|
|||
<div class="modal-body">
|
||||
<div class="alert alert-block alert-error task-delete-message">
|
||||
<h5><i class="icon-warning-sign" style="font-size:32px;"></i> Unexpected bad things will happen if you don't read this</h5>
|
||||
<h6>This action CANNOT be undone. This will delete the <strong>{{ task.name }}</strong> task, time logged and comments permanently.</h6>
|
||||
<h6>This action CANNOT be undone. This will delete the <strong>{{ task.rec_name }}</strong> task, time logged and comments permanently.</h6>
|
||||
<hr/>
|
||||
<a href="{{ url_for('project.work.delete_task', task_id=task.id) }}" class="btn btn-danger">{{ _('Delete') }}</a>
|
||||
<a class="btn cancel-delete-task" data-dismiss="modal">{{ _('Cancel') }}</a>
|
||||
|
@ -313,7 +313,7 @@
|
|||
<p>{{ task.created_by.display_name or task.create_uid.name }} reported <abbr title="{{ request.nereid_user.aslocaltime(task.create_date) }}" class="timeago"> on {{ request.nereid_user.aslocaltime(task.create_date) }}</abbr>
|
||||
</p>
|
||||
<input type="text" id="task-{{ task.id }}"
|
||||
class="input-xlarge span6" style="display:none" value="{{ task.name }}">
|
||||
class="input-xlarge span6" style="display:none" value="{{ task.rec_name }}">
|
||||
<sup>
|
||||
<a data-url="{{ url_for("project.work.edit_task", active_id=task.id) }}" class="btn save-edited-task" style="display:none" rel="tooltip" title="Edit Task Name">
|
||||
<i class="icon-save"></i>
|
||||
|
@ -322,7 +322,7 @@
|
|||
</sup>
|
||||
<h3 class="task-name btn-edit-task-area">
|
||||
<a class="btn pull-right btn-edit-task" style="display:none" input="#task-{{ task.id }}"><i class="icon-edit"></i> Edit</a>
|
||||
#{{ task.id }}: {{ task.name }}
|
||||
#{{ task.id }}: {{ task.rec_name }}
|
||||
</h3>
|
||||
<div class="btn-group span5">
|
||||
<a class="btn pull-left" data-toggle="modal" href="#change-dates">
|
||||
|
|
|
@ -43,7 +43,7 @@ class TestCompany(NereidTestCase):
|
|||
Return templates
|
||||
"""
|
||||
self.templates = {
|
||||
'localhost/login.jinja': '',
|
||||
'login.jinja': '',
|
||||
}
|
||||
return self.templates.get(name)
|
||||
|
||||
|
@ -54,50 +54,53 @@ class TestCompany(NereidTestCase):
|
|||
|
||||
with Transaction().start(DB_NAME, USER, CONTEXT):
|
||||
|
||||
currency = self.Currency.create({
|
||||
currency, = self.Currency.create([{
|
||||
'name': 'US Dollar',
|
||||
'code': 'USD',
|
||||
'symbol': '$',
|
||||
})
|
||||
company = self.Company.create({
|
||||
}])
|
||||
company_party, = self.Party.create([{
|
||||
'name': 'Openlabs',
|
||||
}])
|
||||
company, = self.Company.create([{
|
||||
'party': company_party.id,
|
||||
'currency': currency.id,
|
||||
})
|
||||
party1 = self.Party.create({
|
||||
}])
|
||||
party1, = self.Party.create([{
|
||||
'name': 'Non registered user',
|
||||
})
|
||||
}])
|
||||
|
||||
# Create guest user
|
||||
guest_user = self.NereidUser.create({
|
||||
guest_user, = self.NereidUser.create([{
|
||||
'party': party1.id,
|
||||
'display_name': 'Guest User',
|
||||
'email': 'guest@openlabs.co.in',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
})
|
||||
}])
|
||||
|
||||
party2 = self.Party.create({
|
||||
party2, = self.Party.create([{
|
||||
'name': 'Registered User1',
|
||||
})
|
||||
registered_user1 = self.NereidUser.create({
|
||||
}])
|
||||
registered_user1, = self.NereidUser.create([{
|
||||
'party': party2.id,
|
||||
'display_name': 'Registered User',
|
||||
'email': 'email@example.com',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
})
|
||||
}])
|
||||
|
||||
# Create nereid project site
|
||||
url_map, = self.URLMap.search([], limit=1)
|
||||
en_us, = self.Language.search([('code', '=', 'en_US')])
|
||||
nereid_project_website = self.Website.create({
|
||||
nereid_project_website, = self.Website.create([{
|
||||
'name': 'localhost',
|
||||
'url_map': url_map.id,
|
||||
'company': company.id,
|
||||
'application_user': USER,
|
||||
'default_language': en_us.id,
|
||||
'guest_user': guest_user.id,
|
||||
})
|
||||
}])
|
||||
self.Company.write([company], {
|
||||
'project_admins': [('add', [registered_user1.id])],
|
||||
})
|
||||
|
|
|
@ -32,9 +32,6 @@ class TestNereidProject(NereidTestCase):
|
|||
Creates default values to be used by test cases
|
||||
'''
|
||||
|
||||
# pylint: disable-msg=C0103
|
||||
# pylint False trigger Using Invalid name
|
||||
|
||||
def setUp(self):
|
||||
"""
|
||||
Set up data used in the tests.
|
||||
|
@ -42,6 +39,7 @@ class TestNereidProject(NereidTestCase):
|
|||
"""
|
||||
trytond.tests.test_tryton.install_module('nereid_project')
|
||||
self.ActivityAllowedModel = POOL.get('nereid.activity.allowed_model')
|
||||
self.Work = POOL.get('timesheet.work')
|
||||
self.Model = POOL.get('ir.model')
|
||||
self.Project = POOL.get('project.work')
|
||||
self.Company = POOL.get('company.company')
|
||||
|
@ -65,105 +63,119 @@ class TestNereidProject(NereidTestCase):
|
|||
('X-Requested-With', 'XMLHttpRequest'),
|
||||
]
|
||||
|
||||
self.templates = {
|
||||
'login.jinja': '{{ get_flashed_messages()|safe }}',
|
||||
'project/project.jinja': '{{ project.rec_name }}',
|
||||
'project/home.jinja': '{{ projects|length }}',
|
||||
'project/timesheet.jinja': '{{ employees|length }}',
|
||||
'project/files.jinja':
|
||||
'{{ project.children[0].attachments|length }}',
|
||||
'project/permissions.jinja': '{{ invitations|length }}',
|
||||
'project/plan.jinja': '{{ }}',
|
||||
'project/compare-performance.jinja': '{{ employees|length }}',
|
||||
'project/emails/text_content.jinja': '',
|
||||
'project/emails/html_content.jinja': '',
|
||||
'project/emails/invite_2_project_text.html': '',
|
||||
'project/emails/inform_addition_2_project_text.html': '',
|
||||
}
|
||||
|
||||
def create_defaults(self):
|
||||
"""
|
||||
Setup the defaults
|
||||
"""
|
||||
currency = self.Currency.create({
|
||||
currency, = self.Currency.create([{
|
||||
'name': 'US Dollar',
|
||||
'code': 'USD',
|
||||
'symbol': '$',
|
||||
})
|
||||
company = self.Company.create({
|
||||
}])
|
||||
company_party, = self.Party.create([{
|
||||
'name': 'Openlabs',
|
||||
}])
|
||||
company, = self.Company.create([{
|
||||
'party': company_party.id,
|
||||
'currency': currency.id,
|
||||
})
|
||||
}])
|
||||
|
||||
party1 = self.Party.create({
|
||||
party1, party2, party3, party4 = self.Party.create([{
|
||||
'name': 'Non registered user',
|
||||
})
|
||||
|
||||
# Create guest user
|
||||
guest_user = self.NereidUser.create({
|
||||
'party': party1.id,
|
||||
'display_name': 'Guest User',
|
||||
'email': 'guest@openlabs.co.in',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
})
|
||||
|
||||
# Create registered user
|
||||
party2 = self.Party.create({
|
||||
'name': 'Registered User1',
|
||||
})
|
||||
party3 = self.Party.create({
|
||||
}, {
|
||||
'name': 'Registered User',
|
||||
}, {
|
||||
'name': 'Registered User2',
|
||||
})
|
||||
employee1 = self.Employee.create({
|
||||
'company': company.id,
|
||||
'party': party2.id,
|
||||
})
|
||||
employee2 = self.Employee.create({
|
||||
'company': company.id,
|
||||
'party': party3.id,
|
||||
})
|
||||
registered_user1 = self.NereidUser.create({
|
||||
'party': party2.id,
|
||||
'display_name': 'Registered User',
|
||||
'email': 'email@example.com',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
'employee': employee1.id,
|
||||
})
|
||||
registered_user2 = self.NereidUser.create({
|
||||
'party': party3.id,
|
||||
'display_name': 'Registered User2',
|
||||
'email': 'example@example.com',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
'employee': employee2.id,
|
||||
})
|
||||
party4 = self.Party.create({
|
||||
}, {
|
||||
'name': 'Registered User3',
|
||||
})
|
||||
registered_user3 = self.NereidUser.create({
|
||||
'party': party4.id,
|
||||
'display_name': 'Registered User3',
|
||||
'email': 'res_user@example.com',
|
||||
'password': 'password',
|
||||
}])
|
||||
|
||||
# Create Employee
|
||||
employee1, employee2 = self.Employee.create([{
|
||||
'company': company.id,
|
||||
})
|
||||
'party': party2.id,
|
||||
}, {
|
||||
'company': company.id,
|
||||
'party': party3.id,
|
||||
}])
|
||||
|
||||
# Create guest user, and 3 registered user
|
||||
guest_user, registered_user1, registered_user2, registered_user3, = \
|
||||
self.NereidUser.create([{
|
||||
'party': party1.id,
|
||||
'display_name': 'Guest User',
|
||||
'email': 'guest@openlabs.co.in',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
}, {
|
||||
'party': party2.id,
|
||||
'display_name': 'Registered User1',
|
||||
'email': 'email@example.com',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
'employee': employee1.id,
|
||||
}, {
|
||||
'party': party3.id,
|
||||
'display_name': 'Registered User2',
|
||||
'email': 'example@example.com',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
'employee': employee2.id,
|
||||
}, {
|
||||
'party': party4.id,
|
||||
'display_name': 'Registered User3',
|
||||
'email': 'res_user@example.com',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
}])
|
||||
|
||||
self.Company.write([company], {
|
||||
'project_admins': [('add', [registered_user1.id])],
|
||||
'employees': [('add', [employee1.id])],
|
||||
})
|
||||
menu_list = self.Action.search([('usage', '=', 'menu')])
|
||||
user1 = self.User.create({
|
||||
'name': 'res_user1',
|
||||
'login': 'res_user1',
|
||||
'password': '1234',
|
||||
'menu': menu_list[0].id,
|
||||
'main_company': company.id,
|
||||
'company': company.id,
|
||||
})
|
||||
user2 = self.User.create({
|
||||
'name': 'res_user2',
|
||||
'login': 'res_user2',
|
||||
'password': '5678',
|
||||
'menu': menu_list[0].id,
|
||||
})
|
||||
|
||||
user1, user2 = self.User.create([
|
||||
{
|
||||
'name': 'res_user1',
|
||||
'login': 'res_user1',
|
||||
'password': '1234',
|
||||
'menu': menu_list[0].id,
|
||||
'main_company': company.id,
|
||||
'company': company.id,
|
||||
}, {
|
||||
'name': 'res_user2',
|
||||
'login': 'res_user2',
|
||||
'password': '5678',
|
||||
'menu': menu_list[0].id,
|
||||
}
|
||||
])
|
||||
# Create nereid project site
|
||||
url_map, = self.URLMap.search([], limit=1)
|
||||
en_us, = self.Language.search([('code', '=', 'en_US')])
|
||||
nereid_project_website = self.Website.create({
|
||||
nereid_project_website, = self.Website.create([{
|
||||
'name': 'localhost',
|
||||
'url_map': url_map.id,
|
||||
'company': company.id,
|
||||
'application_user': user1.id,
|
||||
'application_user': USER,
|
||||
'default_language': en_us.id,
|
||||
'guest_user': guest_user.id,
|
||||
})
|
||||
}])
|
||||
|
||||
# Nereid Permission
|
||||
permission = self.Permission.search([
|
||||
|
@ -193,29 +205,6 @@ class TestNereidProject(NereidTestCase):
|
|||
'user2': user2,
|
||||
}
|
||||
|
||||
def get_template_source(self, name):
|
||||
"""
|
||||
Return templates
|
||||
"""
|
||||
self.templates = {
|
||||
'localhost/login.jinja': '{{ get_flashed_messages()|safe }}',
|
||||
'localhost/project/project.jinja': '{{ project.name }}',
|
||||
'localhost/project/home.jinja': '{{ projects|length }}',
|
||||
'localhost/project/timesheet.jinja': '{{ employees|length }}',
|
||||
'localhost/project/files.jinja':
|
||||
'{{ project.children[0].attachments|length }}',
|
||||
'localhost/project/permissions.jinja':
|
||||
'{{ invitations|length }}',
|
||||
'localhost/project/plan.jinja': '{{ }}',
|
||||
'localhost/project/compare-performance.jinja':
|
||||
'{{ employees|length }}',
|
||||
'localhost/project/emails/text_content.jinja': '',
|
||||
'localhost/project/emails/html_content.jinja': '',
|
||||
'localhost/project/emails/invite_2_project_text.html': '',
|
||||
'localhost/project/emails/inform_addition_2_project_text.html': '',
|
||||
}
|
||||
return self.templates.get(name)
|
||||
|
||||
def test_0010_create_project_when_user_is_not_admin(self):
|
||||
"""
|
||||
Tests for the creation of project when nereid user is not admin, this
|
||||
|
@ -379,13 +368,15 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
with app.test_client() as c:
|
||||
|
||||
|
@ -414,20 +405,29 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
self.Project.create({
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
'state': 'opened',
|
||||
})
|
||||
self.Project.create({
|
||||
'name': 'PQR',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
'state': 'opened',
|
||||
})
|
||||
work1, work2 = self.Work.create([
|
||||
{
|
||||
'name': 'ABC',
|
||||
'company': data['company'].id,
|
||||
},
|
||||
{
|
||||
'name': 'PQR',
|
||||
'company': data['company'].id,
|
||||
}
|
||||
])
|
||||
project1, project2 = self.Project.create([
|
||||
{
|
||||
'work': work1.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
},
|
||||
{
|
||||
'work': work2.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
}
|
||||
])
|
||||
self.assertEqual(len(self.Project.search([])), 2)
|
||||
with app.test_client() as c:
|
||||
|
||||
login_data = {
|
||||
|
@ -458,20 +458,38 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project1 = self.Project.create({
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
'state': 'opened',
|
||||
})
|
||||
self.Project.create({
|
||||
'name': 'PQR',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
'state': 'opened',
|
||||
})
|
||||
work = self.Work.create([
|
||||
{
|
||||
'name': 'ABC',
|
||||
'company': data['company'].id,
|
||||
},
|
||||
{
|
||||
'name': 'PQR',
|
||||
'company': data['company'].id,
|
||||
}
|
||||
])
|
||||
project1, project2 = self.Project.create([
|
||||
{
|
||||
'work': work[0].id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
},
|
||||
{
|
||||
'work': work[1].id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
}
|
||||
])
|
||||
self.assertEqual(len(self.Project.search([])), 2)
|
||||
|
||||
self.Project.write(
|
||||
[project1],
|
||||
{
|
||||
'participants': [
|
||||
('add', [data['registered_user3'].id])
|
||||
]
|
||||
}
|
||||
)
|
||||
|
||||
with app.test_client() as c:
|
||||
|
||||
|
@ -483,16 +501,6 @@ class TestNereidProject(NereidTestCase):
|
|||
with Transaction().set_context({
|
||||
'company': data['company'].id
|
||||
}):
|
||||
|
||||
self.Project.write(
|
||||
[project1],
|
||||
{
|
||||
'participants': [
|
||||
('add', [data['registered_user3'].id])
|
||||
]
|
||||
}
|
||||
)
|
||||
|
||||
response = c.get('en_US/projects')
|
||||
|
||||
# Total project shown is 1 as nereid user is a participant
|
||||
|
@ -508,13 +516,15 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
with app.test_client() as c:
|
||||
|
||||
|
@ -573,13 +583,15 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
# For project nereid user should be participant of that project
|
||||
self.Project.write(
|
||||
|
@ -627,13 +639,15 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
# For project nereid user should be participant of that project
|
||||
self.Project.write(
|
||||
|
@ -654,11 +668,11 @@ class TestNereidProject(NereidTestCase):
|
|||
'company': data['company'].id
|
||||
}):
|
||||
# Create Tags
|
||||
tag = self.Tag.create({
|
||||
tag, = self.Tag.create([{
|
||||
'name': 'tag1',
|
||||
'color': 'color1',
|
||||
'project': project.id
|
||||
})
|
||||
}])
|
||||
response = c.post('/en_US/tag-%d/-delete' % tag.id)
|
||||
|
||||
# Redirecting back to refer page
|
||||
|
@ -680,13 +694,15 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
with app.test_client() as c:
|
||||
|
||||
|
@ -699,11 +715,11 @@ class TestNereidProject(NereidTestCase):
|
|||
'company': data['company'].id
|
||||
}):
|
||||
# Create Tags
|
||||
tag = self.Tag.create({
|
||||
tag, = self.Tag.create([{
|
||||
'name': 'tag',
|
||||
'color': 'color',
|
||||
'project': project.id
|
||||
})
|
||||
}])
|
||||
|
||||
response = c.post(
|
||||
'/en_US/tag-%d/-delete' % tag.id,
|
||||
|
@ -762,25 +778,33 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
task1 = self.Project.create({
|
||||
}])
|
||||
work1, work2 = self.Work.create([{
|
||||
'name': 'ABC_task',
|
||||
'company': data['company'].id,
|
||||
}, {
|
||||
'name': 'PQR_task',
|
||||
'company': data['company'].id,
|
||||
}])
|
||||
task1, task2 = self.Project.create([{
|
||||
'work': work1.id,
|
||||
'comment': 'task_desc',
|
||||
'parent': project.id,
|
||||
'company': data['company'].id,
|
||||
})
|
||||
task2 = self.Project.create({
|
||||
'name': 'PQR_task',
|
||||
'type': 'task',
|
||||
}, {
|
||||
'work': work2.id,
|
||||
'comment': 'task2',
|
||||
'parent': project.id,
|
||||
'company': data['company'].id,
|
||||
})
|
||||
'type': 'task',
|
||||
}])
|
||||
|
||||
login_data = {
|
||||
'email': 'email@example.com',
|
||||
|
@ -884,27 +908,31 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
|
||||
}])
|
||||
# Add tasks to project
|
||||
task1 = self.Project.create({
|
||||
work1, = self.Work.create([{
|
||||
'name': 'ABC_task',
|
||||
'company': data['company'].id,
|
||||
}])
|
||||
task1, = self.Project.create([{
|
||||
'work': work1.id,
|
||||
'comment': 'task_desc',
|
||||
'parent': project.id,
|
||||
'company': data['company'].id,
|
||||
})
|
||||
attachment = self.Attachment.create({
|
||||
}])
|
||||
attachment, = self.Attachment.create([{
|
||||
'name': 'Attachment1',
|
||||
'type': 'link',
|
||||
'resource': ('project.work', task1.id),
|
||||
'description': 'desc1',
|
||||
})
|
||||
}])
|
||||
|
||||
self.Project.write(
|
||||
[task1],
|
||||
|
@ -934,19 +962,24 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
task1 = self.Project.create({
|
||||
}])
|
||||
work1, = self.Work.create([{
|
||||
'name': 'ABC_task',
|
||||
'company': data['company'].id,
|
||||
}])
|
||||
task1, = self.Project.create([{
|
||||
'work': work1.id,
|
||||
'comment': 'task_desc',
|
||||
'parent': project.id,
|
||||
'company': data['company'].id,
|
||||
})
|
||||
}])
|
||||
with app.test_client() as c:
|
||||
|
||||
# User Login
|
||||
|
@ -994,19 +1027,21 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
invitation = self.ProjectInvitation.create({
|
||||
}])
|
||||
invitation, = self.ProjectInvitation.create([{
|
||||
'email': 'example@example.com',
|
||||
'invitation_code': '123',
|
||||
'nereid_user': data['registered_user3'].id,
|
||||
'project': project.id,
|
||||
})
|
||||
}])
|
||||
with app.test_client() as c:
|
||||
|
||||
# User Login
|
||||
|
@ -1024,7 +1059,7 @@ class TestNereidProject(NereidTestCase):
|
|||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.data, '0')
|
||||
|
||||
def test_0180_remove_participants_by_nereid_user(self):
|
||||
def test_0160_remove_participants_by_nereid_user(self):
|
||||
"""
|
||||
Checks if removes participant by user who is not admin, it won't
|
||||
remove
|
||||
|
@ -1034,19 +1069,21 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
# Add participant to project
|
||||
participant = self.ProjectUsers.create({
|
||||
participant, = self.ProjectUsers.create([{
|
||||
'project': project.id,
|
||||
'user': data['registered_user2'].id,
|
||||
})
|
||||
}])
|
||||
with app.test_client() as c:
|
||||
|
||||
# User Login
|
||||
|
@ -1069,7 +1106,7 @@ class TestNereidProject(NereidTestCase):
|
|||
response.data
|
||||
)
|
||||
|
||||
def test_0160_remove_paricipant_admin(self):
|
||||
def test_0170_remove_paricipant_admin(self):
|
||||
"""
|
||||
Checks remove participant by admin
|
||||
"""
|
||||
|
@ -1078,19 +1115,21 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
# Add participant to project
|
||||
participant = self.ProjectUsers.create({
|
||||
participant, = self.ProjectUsers.create([{
|
||||
'project': project.id,
|
||||
'user': data['registered_user2'].id,
|
||||
})
|
||||
}])
|
||||
with app.test_client() as c:
|
||||
|
||||
# User Login
|
||||
|
@ -1125,7 +1164,7 @@ class TestNereidProject(NereidTestCase):
|
|||
in response.data
|
||||
)
|
||||
|
||||
def test_0170_remove_invite(self):
|
||||
def test_0180_remove_invite(self):
|
||||
"""
|
||||
Checks removing inviation by non admin user
|
||||
"""
|
||||
|
@ -1134,20 +1173,22 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
invitation = self.ProjectInvitation.create({
|
||||
invitation, = self.ProjectInvitation.create([{
|
||||
'email': 'example@example.com',
|
||||
'invitation_code': '123',
|
||||
'nereid_user': data['registered_user3'].id,
|
||||
'project': project.id,
|
||||
})
|
||||
}])
|
||||
with app.test_client() as c:
|
||||
|
||||
# User Login
|
||||
|
@ -1175,7 +1216,7 @@ class TestNereidProject(NereidTestCase):
|
|||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
def test_0180_resend_invite(self):
|
||||
def test_0190_resend_invite(self):
|
||||
"""
|
||||
Checks if it resend the invitation
|
||||
"""
|
||||
|
@ -1184,20 +1225,22 @@ class TestNereidProject(NereidTestCase):
|
|||
app = self.get_app(DEBUG=True)
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
'parent': False,
|
||||
}])
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
invitation = self.ProjectInvitation.create({
|
||||
invitation, = self.ProjectInvitation.create([{
|
||||
'email': 'example@example.com',
|
||||
'invitation_code': '123',
|
||||
'nereid_user': data['registered_user3'].id,
|
||||
'project': project.id,
|
||||
})
|
||||
}])
|
||||
with app.test_client() as c:
|
||||
|
||||
# User Login
|
||||
|
@ -1226,25 +1269,29 @@ class TestNereidProject(NereidTestCase):
|
|||
data = self.create_defaults()
|
||||
|
||||
# Create Project
|
||||
project = self.Project.create({
|
||||
work, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': data['company'].id,
|
||||
}])
|
||||
|
||||
project, = self.Project.create([{
|
||||
'work': work.id,
|
||||
'type': 'project',
|
||||
'parent': False,
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
# Add participant to project
|
||||
self.ProjectUsers.create({
|
||||
self.ProjectUsers.create([{
|
||||
'project': project.id,
|
||||
'user': data['registered_user2'].id,
|
||||
})
|
||||
}])
|
||||
self.assertRaises(
|
||||
Exception, self.ProjectUsers.create,
|
||||
{
|
||||
[{
|
||||
'project': project.id,
|
||||
'user': data['registered_user2'].id,
|
||||
}
|
||||
}]
|
||||
)
|
||||
|
||||
|
||||
|
@ -1259,4 +1306,3 @@ def suite():
|
|||
|
||||
if __name__ == '__main__':
|
||||
unittest.TextTestRunner(verbosity=2).run(suite())
|
||||
# pylint: enable-msg=C0103
|
||||
|
|
|
@ -43,6 +43,7 @@ class TestTask(NereidTestCase):
|
|||
"""
|
||||
trytond.tests.test_tryton.install_module('nereid_project')
|
||||
self.ActivityAllowedModel = POOL.get('nereid.activity.allowed_model')
|
||||
self.Work = POOL.get('timesheet.work')
|
||||
self.Model = POOL.get('ir.model')
|
||||
self.Company = POOL.get('company.company')
|
||||
self.Employee = POOL.get('company.employee')
|
||||
|
@ -69,110 +70,113 @@ class TestTask(NereidTestCase):
|
|||
"""
|
||||
Setup the defaults for all tests.
|
||||
"""
|
||||
currency = self.Currency.create({
|
||||
currency, = self.Currency.create([{
|
||||
'name': 'US Dollar',
|
||||
'code': 'USD',
|
||||
'symbol': '$',
|
||||
})
|
||||
company = self.Company.create({
|
||||
}])
|
||||
company_party, = self.Party.create([{
|
||||
'name': 'Openlabs',
|
||||
}])
|
||||
company, = self.Company.create([{
|
||||
'party': company_party.id,
|
||||
'currency': currency.id,
|
||||
})
|
||||
party0 = self.Party.create({
|
||||
}])
|
||||
party0, party1, party2, = self.Party.create([{
|
||||
'name': 'Non registered user',
|
||||
})
|
||||
}, {
|
||||
'name': 'Registered User1',
|
||||
}, {
|
||||
'name': 'Registered User2',
|
||||
}])
|
||||
|
||||
# Create guest user
|
||||
guest_user = self.NereidUser.create({
|
||||
guest_user, = self.NereidUser.create([{
|
||||
'party': party0.id,
|
||||
'display_name': 'Guest User',
|
||||
'email': 'guest@openlabs.co.in',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
})
|
||||
}])
|
||||
|
||||
party1 = self.Party.create({
|
||||
'name': 'Registered User1',
|
||||
})
|
||||
party2 = self.Party.create({
|
||||
'name': 'Registered User2',
|
||||
})
|
||||
|
||||
employee1 = self.Employee.create({
|
||||
employee1, = self.Employee.create([{
|
||||
'company': company.id,
|
||||
'party': party1.id,
|
||||
})
|
||||
registered_user1 = self.NereidUser.create({
|
||||
}])
|
||||
registered_user1, = self.NereidUser.create([{
|
||||
'party': party1.id,
|
||||
'display_name': 'Registered User',
|
||||
'email': 'email@example.com',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
'employee': employee1.id,
|
||||
})
|
||||
registered_user2 = self.NereidUser.create({
|
||||
}])
|
||||
registered_user2, = self.NereidUser.create([{
|
||||
'party': party2.id,
|
||||
'display_name': 'Registered User',
|
||||
'email': 'example@example.com',
|
||||
'password': 'password',
|
||||
'company': company.id,
|
||||
})
|
||||
}])
|
||||
self.Company.write([company], {
|
||||
'project_admins': [('add', [registered_user1.id])],
|
||||
'employees': [('add', [employee1.id])],
|
||||
})
|
||||
menu_list = self.Action.search([('usage', '=', 'menu')])
|
||||
user1 = self.User.create({
|
||||
user1, = self.User.create([{
|
||||
'name': 'res_user1',
|
||||
'login': 'res_user1',
|
||||
'password': '1234',
|
||||
'menu': menu_list[0].id,
|
||||
'main_company': company.id,
|
||||
'company': company.id,
|
||||
})
|
||||
user2 = self.User.create({
|
||||
}])
|
||||
user2, = self.User.create([{
|
||||
'name': 'res_user2',
|
||||
'login': 'res_user2',
|
||||
'password': '5678',
|
||||
'menu': menu_list[0].id,
|
||||
})
|
||||
}])
|
||||
|
||||
# Create nereid project site
|
||||
url_map, = self.URLMap.search([], limit=1)
|
||||
en_us, = self.Language.search([('code', '=', 'en_US')])
|
||||
nereid_project_website = self.Website.create({
|
||||
nereid_project_website, = self.Website.create([{
|
||||
'name': 'localhost',
|
||||
'url_map': url_map.id,
|
||||
'company': company.id,
|
||||
'application_user': user1.id,
|
||||
'application_user': USER,
|
||||
'default_language': en_us.id,
|
||||
'guest_user': guest_user.id,
|
||||
})
|
||||
}])
|
||||
|
||||
# Create project
|
||||
project1 = self.Project.create({
|
||||
work1, = self.Work.create([{
|
||||
'name': 'ABC',
|
||||
'type': 'project',
|
||||
'company': company.id,
|
||||
}])
|
||||
project1, = self.Project.create([{
|
||||
'work': work1.id,
|
||||
'type': 'project',
|
||||
'state': 'opened',
|
||||
})
|
||||
}])
|
||||
|
||||
# Create Tags
|
||||
tag1 = self.Tag.create({
|
||||
tag1, = self.Tag.create([{
|
||||
'name': 'tag1',
|
||||
'color': 'color1',
|
||||
'project': project1.id
|
||||
})
|
||||
tag2 = self.Tag.create({
|
||||
}])
|
||||
tag2, = self.Tag.create([{
|
||||
'name': 'tag2',
|
||||
'color': 'color2',
|
||||
'project': project1.id
|
||||
})
|
||||
tag3 = self.Tag.create({
|
||||
}])
|
||||
tag3, = self.Tag.create([{
|
||||
'name': 'tag3',
|
||||
'color': 'color3',
|
||||
'project': project1.id
|
||||
})
|
||||
}])
|
||||
|
||||
# Nereid Permission
|
||||
permission = self.Permission.search([
|
||||
|
@ -187,6 +191,17 @@ class TestTask(NereidTestCase):
|
|||
}
|
||||
)
|
||||
|
||||
self.templates = {
|
||||
'login.jinja': '{{ get_flashed_messages()|safe }}',
|
||||
'project/comment.jinja': '',
|
||||
'project/emails/text_content.jinja': '',
|
||||
'project/emails/html_content.jinja': '',
|
||||
'project/task.jinja': '{{ task.id }}',
|
||||
'project/comment.jinja': '',
|
||||
'project/tasks-by-employee.jinja': '',
|
||||
'project/project-task-list.jinja': '{{ tasks|length }}',
|
||||
}
|
||||
|
||||
return {
|
||||
'company': company,
|
||||
'employee1': employee1,
|
||||
|
@ -198,6 +213,7 @@ class TestTask(NereidTestCase):
|
|||
'guest_user': guest_user,
|
||||
'user1': user1,
|
||||
'user2': user2,
|
||||
'work1': work1,
|
||||
'project1': project1,
|
||||
'tag1': tag1,
|
||||
'tag2': tag2,
|
||||
|
@ -209,24 +225,33 @@ class TestTask(NereidTestCase):
|
|||
Create Default for from create_defaults() Task.
|
||||
'''
|
||||
data = self.create_defaults()
|
||||
data['task1'] = self.Project.create({
|
||||
data['work2'], = self.Work.create([{
|
||||
'name': 'ABC_task',
|
||||
'company': data['company'].id,
|
||||
}])
|
||||
data['task1'], = self.Project.create([{
|
||||
'work': data['work2'].id,
|
||||
'comment': 'task_desc',
|
||||
'parent': data['project1'].id,
|
||||
'company': data['company'].id,
|
||||
})
|
||||
data['task2'] = self.Project.create({
|
||||
}])
|
||||
data['work3'], = self.Work.create([{
|
||||
'name': 'ABC_task2',
|
||||
'company': data['company'].id,
|
||||
}])
|
||||
data['task2'], = self.Project.create([{
|
||||
'work': data['work3'].id,
|
||||
'comment': 'task_desc',
|
||||
'parent': data['project1'].id,
|
||||
'company': data['company'].id,
|
||||
})
|
||||
data['task3'] = self.Project.create({
|
||||
}])
|
||||
data['work4'], = self.Work.create([{
|
||||
'name': 'ABC_task3',
|
||||
'company': data['company'].id,
|
||||
}])
|
||||
data['task3'], = self.Project.create([{
|
||||
'work': data['work4'].id,
|
||||
'comment': 'task_desc',
|
||||
'parent': data['project1'].id,
|
||||
'company': data['company'].id,
|
||||
})
|
||||
}])
|
||||
|
||||
self.Project.write(
|
||||
[data['task1'].parent],
|
||||
|
@ -252,18 +277,6 @@ class TestTask(NereidTestCase):
|
|||
"""
|
||||
Return templates.
|
||||
"""
|
||||
self.templates = {
|
||||
'localhost/login.jinja': '{{ get_flashed_messages()|safe }}',
|
||||
'localhost/project/comment.jinja': '',
|
||||
'localhost/project/emails/text_content.jinja': '',
|
||||
'localhost/project/emails/html_content.jinja': '',
|
||||
'localhost/project/task.jinja': '{{ task.id }}',
|
||||
'localhost/project/comment.jinja': '',
|
||||
'localhost/project/tasks-by-employee.jinja': '',
|
||||
'localhost/project/project-task-list.jinja': '{{ tasks|length }}',
|
||||
'localhost/project/emails/project_text_content.jinja': '{{ task }}',
|
||||
'localhost/project/emails/project_html_content.jinja': '{{ task }}',
|
||||
}
|
||||
return self.templates.get(name)
|
||||
|
||||
def test_0010_create_task(self):
|
||||
|
@ -954,11 +967,11 @@ class TestTask(NereidTestCase):
|
|||
app = self.get_app()
|
||||
task = data['task1']
|
||||
|
||||
comment = self.History.create({
|
||||
comment, = self.History.create([{
|
||||
'project': task.id,
|
||||
'updated_by': data['registered_user1'].id,
|
||||
'comment': 'comment1',
|
||||
})
|
||||
}])
|
||||
login_data = {
|
||||
'email': 'email@example.com',
|
||||
'password': 'password',
|
||||
|
@ -1105,12 +1118,12 @@ class TestTask(NereidTestCase):
|
|||
)
|
||||
self.assertTrue(
|
||||
self.Project.search([
|
||||
('name', '=', 'Task with multiple tags')
|
||||
('rec_name', '=', 'Task with multiple tags')
|
||||
])
|
||||
)
|
||||
|
||||
task, = self.Project.search([
|
||||
('name', '=', 'Task with multiple tags'),
|
||||
('rec_name', '=', 'Task with multiple tags'),
|
||||
])
|
||||
|
||||
# Tags added in above created task
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[tryton]
|
||||
version=2.6.3.0
|
||||
version=2.8.0.1dev
|
||||
depends:
|
||||
ir
|
||||
res
|
||||
|
|
Loading…
Reference in New Issue