|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
# Copyright (C) 2016-2019 RhodeCode GmbH
|
|
|
#
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
# it under the terms of the GNU Affero General Public License, version 3
|
|
|
# (only), as published by the Free Software Foundation.
|
|
|
#
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
# GNU General Public License for more details.
|
|
|
#
|
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
#
|
|
|
# This program is dual-licensed. If you wish to learn more about the
|
|
|
# RhodeCode Enterprise Edition, including its added features, Support services,
|
|
|
# and proprietary license terms, please see https://rhodecode.com/licenses/
|
|
|
|
|
|
import os
|
|
|
import logging
|
|
|
import datetime
|
|
|
|
|
|
from pyramid.view import view_config
|
|
|
from pyramid.renderers import render_to_response
|
|
|
from rhodecode.apps._base import BaseAppView
|
|
|
from rhodecode.lib.celerylib import run_task, tasks
|
|
|
from rhodecode.lib.utils2 import AttributeDict
|
|
|
from rhodecode.model.db import User
|
|
|
from rhodecode.model.notification import EmailNotificationModel
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
class DebugStyleView(BaseAppView):
|
|
|
def load_default_context(self):
|
|
|
c = self._get_local_tmpl_context()
|
|
|
|
|
|
return c
|
|
|
|
|
|
@view_config(
|
|
|
route_name='debug_style_home', request_method='GET',
|
|
|
renderer=None)
|
|
|
def index(self):
|
|
|
c = self.load_default_context()
|
|
|
c.active = 'index'
|
|
|
|
|
|
return render_to_response(
|
|
|
'debug_style/index.html', self._get_template_context(c),
|
|
|
request=self.request)
|
|
|
|
|
|
@view_config(
|
|
|
route_name='debug_style_email', request_method='GET',
|
|
|
renderer=None)
|
|
|
@view_config(
|
|
|
route_name='debug_style_email_plain_rendered', request_method='GET',
|
|
|
renderer=None)
|
|
|
def render_email(self):
|
|
|
c = self.load_default_context()
|
|
|
email_id = self.request.matchdict['email_id']
|
|
|
c.active = 'emails'
|
|
|
|
|
|
pr = AttributeDict(
|
|
|
pull_request_id=123,
|
|
|
title='digital_ocean: fix redis, elastic search start on boot, '
|
|
|
'fix fd limits on supervisor, set postgres 11 version',
|
|
|
description='''
|
|
|
Check if we should use full-topic or mini-topic.
|
|
|
|
|
|
- full topic produces some problems with merge states etc
|
|
|
- server-mini-topic needs probably tweeks.
|
|
|
''',
|
|
|
repo_name='foobar',
|
|
|
source_ref_parts=AttributeDict(type='branch', name='fix-ticket-2000'),
|
|
|
target_ref_parts=AttributeDict(type='branch', name='master'),
|
|
|
)
|
|
|
target_repo = AttributeDict(repo_name='repo_group/target_repo')
|
|
|
source_repo = AttributeDict(repo_name='repo_group/source_repo')
|
|
|
user = User.get_by_username(self.request.GET.get('user')) or self._rhodecode_db_user
|
|
|
# file/commit changes for PR update
|
|
|
commit_changes = AttributeDict({
|
|
|
'added': ['aaaaaaabbbbb', 'cccccccddddddd'],
|
|
|
'removed': ['eeeeeeeeeee'],
|
|
|
})
|
|
|
file_changes = AttributeDict({
|
|
|
'added': ['a/file1.md', 'file2.py'],
|
|
|
'modified': ['b/modified_file.rst'],
|
|
|
'removed': ['.idea'],
|
|
|
})
|
|
|
email_kwargs = {
|
|
|
'test': {},
|
|
|
'message': {
|
|
|
'body': 'message body !'
|
|
|
},
|
|
|
'email_test': {
|
|
|
'user': user,
|
|
|
'date': datetime.datetime.now(),
|
|
|
},
|
|
|
'password_reset': {
|
|
|
'password_reset_url': 'http://example.com/reset-rhodecode-password/token',
|
|
|
|
|
|
'user': user,
|
|
|
'date': datetime.datetime.now(),
|
|
|
'email': 'test@rhodecode.com',
|
|
|
'first_admin_email': User.get_first_super_admin().email
|
|
|
},
|
|
|
'password_reset_confirmation': {
|
|
|
'new_password': 'new-password-example',
|
|
|
'user': user,
|
|
|
'date': datetime.datetime.now(),
|
|
|
'email': 'test@rhodecode.com',
|
|
|
'first_admin_email': User.get_first_super_admin().email
|
|
|
},
|
|
|
'registration': {
|
|
|
'user': user,
|
|
|
'date': datetime.datetime.now(),
|
|
|
},
|
|
|
|
|
|
'pull_request_comment': {
|
|
|
'user': user,
|
|
|
|
|
|
'status_change': None,
|
|
|
'status_change_type': None,
|
|
|
|
|
|
'pull_request': pr,
|
|
|
'pull_request_commits': [],
|
|
|
|
|
|
'pull_request_target_repo': target_repo,
|
|
|
'pull_request_target_repo_url': 'http://target-repo/url',
|
|
|
|
|
|
'pull_request_source_repo': source_repo,
|
|
|
'pull_request_source_repo_url': 'http://source-repo/url',
|
|
|
|
|
|
'pull_request_url': 'http://localhost/pr1',
|
|
|
'pr_comment_url': 'http://comment-url',
|
|
|
'pr_comment_reply_url': 'http://comment-url#reply',
|
|
|
|
|
|
'comment_file': None,
|
|
|
'comment_line': None,
|
|
|
'comment_type': 'note',
|
|
|
'comment_body': 'This is my comment body. *I like !*',
|
|
|
'comment_id': 2048,
|
|
|
'renderer_type': 'markdown',
|
|
|
'mention': True,
|
|
|
|
|
|
},
|
|
|
'pull_request_comment+status': {
|
|
|
'user': user,
|
|
|
|
|
|
'status_change': 'approved',
|
|
|
'status_change_type': 'approved',
|
|
|
|
|
|
'pull_request': pr,
|
|
|
'pull_request_commits': [],
|
|
|
|
|
|
'pull_request_target_repo': target_repo,
|
|
|
'pull_request_target_repo_url': 'http://target-repo/url',
|
|
|
|
|
|
'pull_request_source_repo': source_repo,
|
|
|
'pull_request_source_repo_url': 'http://source-repo/url',
|
|
|
|
|
|
'pull_request_url': 'http://localhost/pr1',
|
|
|
'pr_comment_url': 'http://comment-url',
|
|
|
'pr_comment_reply_url': 'http://comment-url#reply',
|
|
|
|
|
|
'comment_type': 'todo',
|
|
|
'comment_file': None,
|
|
|
'comment_line': None,
|
|
|
'comment_body': '''
|
|
|
I think something like this would be better
|
|
|
|
|
|
```py
|
|
|
|
|
|
def db():
|
|
|
global connection
|
|
|
return connection
|
|
|
|
|
|
```
|
|
|
|
|
|
''',
|
|
|
'comment_id': 2048,
|
|
|
'renderer_type': 'markdown',
|
|
|
'mention': True,
|
|
|
|
|
|
},
|
|
|
'pull_request_comment+file': {
|
|
|
'user': user,
|
|
|
|
|
|
'status_change': None,
|
|
|
'status_change_type': None,
|
|
|
|
|
|
'pull_request': pr,
|
|
|
'pull_request_commits': [],
|
|
|
|
|
|
'pull_request_target_repo': target_repo,
|
|
|
'pull_request_target_repo_url': 'http://target-repo/url',
|
|
|
|
|
|
'pull_request_source_repo': source_repo,
|
|
|
'pull_request_source_repo_url': 'http://source-repo/url',
|
|
|
|
|
|
'pull_request_url': 'http://localhost/pr1',
|
|
|
|
|
|
'pr_comment_url': 'http://comment-url',
|
|
|
'pr_comment_reply_url': 'http://comment-url#reply',
|
|
|
|
|
|
'comment_file': 'rhodecode/model/db.py',
|
|
|
'comment_line': 'o1210',
|
|
|
'comment_type': 'todo',
|
|
|
'comment_body': '''
|
|
|
I like this !
|
|
|
|
|
|
But please check this code::
|
|
|
|
|
|
def main():
|
|
|
print 'ok'
|
|
|
|
|
|
This should work better !
|
|
|
''',
|
|
|
'comment_id': 2048,
|
|
|
'renderer_type': 'rst',
|
|
|
'mention': True,
|
|
|
|
|
|
},
|
|
|
|
|
|
'pull_request_update': {
|
|
|
'updating_user': user,
|
|
|
|
|
|
'status_change': None,
|
|
|
'status_change_type': None,
|
|
|
|
|
|
'pull_request': pr,
|
|
|
'pull_request_commits': [],
|
|
|
|
|
|
'pull_request_target_repo': target_repo,
|
|
|
'pull_request_target_repo_url': 'http://target-repo/url',
|
|
|
|
|
|
'pull_request_source_repo': source_repo,
|
|
|
'pull_request_source_repo_url': 'http://source-repo/url',
|
|
|
|
|
|
'pull_request_url': 'http://localhost/pr1',
|
|
|
|
|
|
# update comment links
|
|
|
'pr_comment_url': 'http://comment-url',
|
|
|
'pr_comment_reply_url': 'http://comment-url#reply',
|
|
|
'ancestor_commit_id': 'f39bd443',
|
|
|
'added_commits': commit_changes.added,
|
|
|
'removed_commits': commit_changes.removed,
|
|
|
'changed_files': (file_changes.added + file_changes.modified + file_changes.removed),
|
|
|
'added_files': file_changes.added,
|
|
|
'modified_files': file_changes.modified,
|
|
|
'removed_files': file_changes.removed,
|
|
|
},
|
|
|
|
|
|
'cs_comment': {
|
|
|
'user': user,
|
|
|
'commit': AttributeDict(idx=123, raw_id='a'*40, message='Commit message'),
|
|
|
'status_change': None,
|
|
|
'status_change_type': None,
|
|
|
|
|
|
'commit_target_repo_url': 'http://foo.example.com/#comment1',
|
|
|
'repo_name': 'test-repo',
|
|
|
'comment_type': 'note',
|
|
|
'comment_file': None,
|
|
|
'comment_line': None,
|
|
|
'commit_comment_url': 'http://comment-url',
|
|
|
'commit_comment_reply_url': 'http://comment-url#reply',
|
|
|
'comment_body': 'This is my comment body. *I like !*',
|
|
|
'comment_id': 2048,
|
|
|
'renderer_type': 'markdown',
|
|
|
'mention': True,
|
|
|
},
|
|
|
'cs_comment+status': {
|
|
|
'user': user,
|
|
|
'commit': AttributeDict(idx=123, raw_id='a' * 40, message='Commit message'),
|
|
|
'status_change': 'approved',
|
|
|
'status_change_type': 'approved',
|
|
|
|
|
|
'commit_target_repo_url': 'http://foo.example.com/#comment1',
|
|
|
'repo_name': 'test-repo',
|
|
|
'comment_type': 'note',
|
|
|
'comment_file': None,
|
|
|
'comment_line': None,
|
|
|
'commit_comment_url': 'http://comment-url',
|
|
|
'commit_comment_reply_url': 'http://comment-url#reply',
|
|
|
'comment_body': '''
|
|
|
Hello **world**
|
|
|
|
|
|
This is a multiline comment :)
|
|
|
|
|
|
- list
|
|
|
- list2
|
|
|
''',
|
|
|
'comment_id': 2048,
|
|
|
'renderer_type': 'markdown',
|
|
|
'mention': True,
|
|
|
},
|
|
|
'cs_comment+file': {
|
|
|
'user': user,
|
|
|
'commit': AttributeDict(idx=123, raw_id='a' * 40, message='Commit message'),
|
|
|
'status_change': None,
|
|
|
'status_change_type': None,
|
|
|
|
|
|
'commit_target_repo_url': 'http://foo.example.com/#comment1',
|
|
|
'repo_name': 'test-repo',
|
|
|
|
|
|
'comment_type': 'note',
|
|
|
'comment_file': 'test-file.py',
|
|
|
'comment_line': 'n100',
|
|
|
|
|
|
'commit_comment_url': 'http://comment-url',
|
|
|
'commit_comment_reply_url': 'http://comment-url#reply',
|
|
|
'comment_body': 'This is my comment body. *I like !*',
|
|
|
'comment_id': 2048,
|
|
|
'renderer_type': 'markdown',
|
|
|
'mention': True,
|
|
|
},
|
|
|
|
|
|
'pull_request': {
|
|
|
'user': user,
|
|
|
'pull_request': pr,
|
|
|
'pull_request_commits': [
|
|
|
('472d1df03bf7206e278fcedc6ac92b46b01c4e21', '''\
|
|
|
my-account: moved email closer to profile as it's similar data just moved outside.
|
|
|
'''),
|
|
|
('cbfa3061b6de2696c7161ed15ba5c6a0045f90a7', '''\
|
|
|
users: description edit fixes
|
|
|
|
|
|
- tests
|
|
|
- added metatags info
|
|
|
'''),
|
|
|
],
|
|
|
|
|
|
'pull_request_target_repo': target_repo,
|
|
|
'pull_request_target_repo_url': 'http://target-repo/url',
|
|
|
|
|
|
'pull_request_source_repo': source_repo,
|
|
|
'pull_request_source_repo_url': 'http://source-repo/url',
|
|
|
|
|
|
'pull_request_url': 'http://code.rhodecode.com/_pull-request/123',
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
template_type = email_id.split('+')[0]
|
|
|
(c.subject, c.headers, c.email_body,
|
|
|
c.email_body_plaintext) = EmailNotificationModel().render_email(
|
|
|
template_type, **email_kwargs.get(email_id, {}))
|
|
|
|
|
|
test_email = self.request.GET.get('email')
|
|
|
if test_email:
|
|
|
recipients = [test_email]
|
|
|
run_task(tasks.send_email, recipients, c.subject,
|
|
|
c.email_body_plaintext, c.email_body)
|
|
|
|
|
|
if self.request.matched_route.name == 'debug_style_email_plain_rendered':
|
|
|
template = 'debug_style/email_plain_rendered.mako'
|
|
|
else:
|
|
|
template = 'debug_style/email.mako'
|
|
|
return render_to_response(
|
|
|
template, self._get_template_context(c),
|
|
|
request=self.request)
|
|
|
|
|
|
@view_config(
|
|
|
route_name='debug_style_template', request_method='GET',
|
|
|
renderer=None)
|
|
|
def template(self):
|
|
|
t_path = self.request.matchdict['t_path']
|
|
|
c = self.load_default_context()
|
|
|
c.active = os.path.splitext(t_path)[0]
|
|
|
c.came_from = ''
|
|
|
c.email_types = {
|
|
|
'cs_comment+file': {},
|
|
|
'cs_comment+status': {},
|
|
|
|
|
|
'pull_request_comment+file': {},
|
|
|
'pull_request_comment+status': {},
|
|
|
|
|
|
'pull_request_update': {},
|
|
|
}
|
|
|
c.email_types.update(EmailNotificationModel.email_types)
|
|
|
|
|
|
return render_to_response(
|
|
|
'debug_style/' + t_path, self._get_template_context(c),
|
|
|
request=self.request)
|
|
|
|
|
|
|