Migration to 2.8 #2089

Review ID: 303003
This commit is contained in:
Priyanka Rani 2013-09-03 23:28:33 +05:30
parent 90dca506f9
commit 1b533ac437
21 changed files with 510 additions and 426 deletions

View File

@ -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

View File

@ -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:

View File

@ -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">

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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>

View File

@ -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> &#8594;
style=' text-decoration:none; color:#2E9AFE'> {{ history.project.parent.rec_name }} </a> &#8594;
<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>

View File

@ -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 }}

View File

@ -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 }}

View File

@ -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> &#8594;
style=' text-decoration:none; color:#2E9AFE'> {{ task.parent.rec_name }} </a> &#8594;
<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>

View File

@ -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 }}.

View File

@ -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 -%}

View File

@ -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' %}

View File

@ -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 %}

View File

@ -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' %}

View File

@ -11,7 +11,7 @@
{% endblock %}
{% block title %}
{{ _("Project: ") + project.name }}
{{ _("Project: ") + project.rec_name }}
{% endblock %}
{% block left %}

View File

@ -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">

View File

@ -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])],
})

View File

@ -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

View File

@ -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

View File

@ -1,5 +1,5 @@
[tryton]
version=2.6.3.0
version=2.8.0.1dev
depends:
ir
res