Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion django_atlassian/addon.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ def register(self, host, username, password, url):
# reqObject.body = JSON.stringify({pluginUri: descriptorUrl});
# reqObject.jar = false;
# request.post(reqObject,
pass


def unregister(self, host, username, password, url):
pass
2 changes: 2 additions & 0 deletions django_atlassian/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@
class DjangoAtlassianConfig(AppConfig):
name = 'django_atlassian'

def ready(self):
pass
32 changes: 13 additions & 19 deletions django_atlassian/backends/common/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,12 @@ def delete_request(self, part):
r = requests.delete(uri, auth=(self.user, self.password))
elif self.sc:
token = self.sc.create_token('DELETE', uri)
headers.update({'Authorization': 'JWT {}'.format(token)})
r = requests.delete(uri)
r = requests.delete(uri, headers={'Authorization': 'JWT {}'.format(token)})
else:
return None
return r


class AtlassianDatabase(object):
Error = requests.exceptions.RequestException

Expand Down Expand Up @@ -190,7 +190,7 @@ def from_native(self, data, field):
elif field[1] in ['user', 'issuetype'] and data is not None:
return data['name']
else:
if field[12] and data.has_key('value'):
if field[12] and 'value' in data:
return data['value']
return data
except Exception as err:
Expand Down Expand Up @@ -250,18 +250,18 @@ def execute(self, sql, params=None):
else:
new_params.extend([i])

if not opts.has_key ('start_at'):
if 'start_at' not in opts:
opts['start_at'] = 0
if not opts.has_key ('max_results'):
if 'max_results' not in opts:
opts['max_results'] = -1
if not opts.has_key ('count_only'):
if 'count_only' not in opts:
opts['count_only'] = False
self.opts = opts
self.sql = self.get_sql_qs(sql)
self.sql = self.sql % tuple(self.escape_type(p) for p in new_params)
self.sql = self.sql % tuple(p for p in new_params)

# Only include the requested fields
if opts.has_key('fields'):
if 'fields' in opts:
# The fields have the name of the 'clause' used, but we need to use
# the 'id' to tell the API what fields to expand
fields_s = opts['fields']
Expand All @@ -271,12 +271,12 @@ def execute(self, sql, params=None):
# replace the fields with the corresponding 'id'
self.fields = self.get_fields(fields)
# Check if we need to update
if opts.has_key('update_fields'):
if 'update_fields' in opts:
rows = self.fetchmany()
self.update(rows, opts['update_fields'])

def fetchone(self):
return self.fetchmany ()
return self.fetchmany()

def fetchmany(self, size=None):
max_results = self.opts['max_results']
Expand Down Expand Up @@ -312,8 +312,8 @@ def get_raw_fields(self, fields=None):
if fields:
for f in fields:
for c in content:
if c.has_key('schema'):
if c.has_key('clauseNames') and c['clauseNames'] and c['clauseNames'][0] == f:
if 'schema' in c:
if 'clauseNames' in c and c['clauseNames'] and c['clauseNames'][0] == f:
ret.append(c)
else:
ret = content
Expand All @@ -331,7 +331,7 @@ def get_fields(self, fields=None):
if not self.raw_fields:
self.raw_fields = self.get_raw_fields(fields)
for f in self.raw_fields:
if f.has_key('schema') and f.has_key('clauseNames') and f['clauseNames']:
if 'schema' in f and 'clauseNames' in f and f['clauseNames']:
schema = f['schema']['type']
array_type = None
if schema == 'any' and f['schema']['custom']:
Expand All @@ -346,12 +346,6 @@ def get_fields(self, fields=None):
ret.append(FieldInfo(f['clauseNames'][0], schema, None, None, None, None, True, None, self.__normalize_field_name(f['name']), f['id'], array_type, editable, choices))
return ret

def escape_type(self, value):
if type(value) == unicode or type(value) == str:
return '"%s"' % value
else:
return value

def get_sql_qs(self, sql):
raise NotImplementedError('missing get_sql_qs implementation')

Expand Down
4 changes: 2 additions & 2 deletions django_atlassian/backends/confluence/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,13 @@ def create_row(self, row):

class DatabaseConvertion(AtlassianDatabaseConvertion):
def extract(self, data, field, raw_field):
if raw_field.has_key('returnName'):
if 'returnName' in raw_field:
return_name = raw_field['returnName']
value = row
for rn in return_name.split('.'):
value = value[rn]
return value
elif row.has_key(field[9]):
elif field[9] in row:
return row[field[9]]
else:
return None
Expand Down
21 changes: 13 additions & 8 deletions django_atlassian/backends/jira/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
'user': 'TextField',
'project': 'TextField',
'resolution': 'TextField',
'status': 'TextField',
'com.pyxis.greenhopper.jira:gh-epic-status': 'TextField',
}

Expand Down Expand Up @@ -99,7 +100,7 @@ def get_relations(self, cursor, table_name):
relations = {}
content = cursor.get_raw_fields()
for f in content:
if f.has_key('schema'):
if 'schema' in f:
if f['schema']['type'] == 'any' and \
f['schema']['custom'] in self.data_type_relations:
relations[f['clauseNames'][0]] = ('issues', 'issue')
Expand All @@ -120,12 +121,12 @@ def get_constraints(self, cursor, table_name):

class DatabaseCursor(AtlassianDatabaseCursor):
arraysize = 100
uri_search_pattern = '/rest/api/3/search?%(get_opts)s&startAt=%(start_at)s&maxResults=%(max_results)s'
uri_edit_pattern = '/rest/api/3/issue/%(issue_id)s'
uri_field = '/rest/api/3/field'
uri_search_pattern = '/rest/api/latest/search?%(get_opts)s&startAt=%(start_at)s&maxResults=%(max_results)s'
uri_edit_pattern = '/rest/api/latest/issue/%(issue_id)s'
uri_field = '/rest/api/latest/field'

def _get_resolutions(self):
uri_resolution = '/rest/api/3/resolution'
uri_resolution = '/rest/api/latest/resolution'
# Get the resolution types
response = self.connection.get_request(uri_resolution)
if response.status_code != requests.codes.ok:
Expand Down Expand Up @@ -268,9 +269,9 @@ def create_row(self, row):

class DatabaseConvertion(AtlassianDatabaseConvertion):
def extract(self, data, field, raw_field):
if data.has_key(field[9]):
if field[9] in data:
return data[field[9]]
elif data['fields'].has_key(field[9]):
elif field[9] in data['fields']:
return data['fields'][field[9]]
else:
logger.error("Field with id %s and name %s not found", field[8], field[9])
Expand All @@ -293,18 +294,22 @@ def from_native(self, data, field):
return None
# Handle the parent link
elif field[1] == 'com.atlassian.jpo:jpo-custom-field-parent':
if data.has_key('data'):
if 'data' in data:
return data['data']['key']
else:
return None
# Handle the resolution
elif field[1] == 'resolution' and data is not None:
return data['name']
elif field[1] == 'status' and data is not None:
return data['name']
elif field[1] == 'array' and data is not None:
if field[10] == 'component':
return [item['name'] for item in data]
elif field[10] == 'string':
return data
elif field[10] == 'version':
return [item['name'] for item in data]
elif field[10] == 'issuelinks':
issuelinks = []
try:
Expand Down
9 changes: 9 additions & 0 deletions django_atlassian/models/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# base models for Atlassian services


class JiraModel:
pass


class ConfluanceModel:
pass
5 changes: 4 additions & 1 deletion django_atlassian/models/confluence.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

from django.db import models

class Content(models.base.Model):
from .base import ConfluanceModel


class Content(models.base.Model, ConfluanceModel):
"""
Base class for all Confluence content models.
"""
Expand Down
10 changes: 1 addition & 9 deletions django_atlassian/models/connect.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import jwt
import time
import json
import urlparse
import urllib
import hashlib
import base64
import atlassian_jwt

from django.db import models


class SecurityContext(models.base.Model):
"""
Stores the security context shared on the installation
Expand All @@ -23,11 +17,9 @@ class SecurityContext(models.base.Model):
client_key = models.CharField(max_length=512, null=False, blank=False)
host = models.CharField(max_length=512, null=False, blank=False)


def create_token(self, method, uri):
token = atlassian_jwt.encode_token(method, uri, self.key, self.shared_secret)
return token


def __unicode__(self):
return "%s: %s" % (self.key, self.host)
Loading