Fix bugs, mostly related to date formatting.

This commit is contained in:
jakedt 2014-03-17 13:10:12 -04:00
parent ddf5f2053c
commit 3542a520f5
11 changed files with 42 additions and 40 deletions

View file

@ -1,7 +1,7 @@
import logging import logging
import json import json
from flask import Blueprint, request, make_response from flask import Blueprint, request
from flask.ext.restful import Resource, abort, Api, reqparse from flask.ext.restful import Resource, abort, Api, reqparse
from flask.ext.restful.utils.cors import crossdomain from flask.ext.restful.utils.cors import crossdomain
from calendar import timegm from calendar import timegm

View file

@ -7,8 +7,9 @@ from flask.ext.restful import abort
from app import app from app import app
from endpoints.api import (RepositoryParamResource, parse_args, query_param, nickname, resource, from endpoints.api import (RepositoryParamResource, parse_args, query_param, nickname, resource,
require_repo_read, require_repo_write, validate_json_request, require_repo_read, require_repo_write, validate_json_request,
ApiResource, internal_only) ApiResource, internal_only, format_date)
from endpoints.common import start_build from endpoints.common import start_build
from endpoints.trigger import BuildTrigger
from data import model from data import model
from auth.permissions import ModifyRepositoryPermission from auth.permissions import ModifyRepositoryPermission
@ -18,14 +19,28 @@ user_files = app.config['USERFILES']
build_logs = app.config['BUILDLOGS'] build_logs = app.config['BUILDLOGS']
def trigger_view(trigger):
if trigger and trigger.uuid:
config_dict = json.loads(trigger.config)
build_trigger = BuildTrigger.get_trigger_for_service(trigger.service.name)
return {
'service': trigger.service.name,
'config': config_dict,
'id': trigger.uuid,
'connected_user': trigger.connected_user.username,
'is_active': build_trigger.is_active(config_dict)
}
return None
def build_status_view(build_obj, can_write=False): def build_status_view(build_obj, can_write=False):
status = build_logs.get_status(build_obj.uuid) status = build_logs.get_status(build_obj.uuid)
logger.debug('Can write: %s job_config: %s', can_write, build_obj.job_config) logger.debug('Can write: %s job_config: %s', can_write, build_obj.job_config)
build_obj.job_config = None
resp = { resp = {
'id': build_obj.uuid, 'id': build_obj.uuid,
'phase': build_obj.phase, 'phase': build_obj.phase,
'started': build_obj.started, 'started': format_date(build_obj.started),
'display_name': build_obj.display_name, 'display_name': build_obj.display_name,
'status': status, 'status': status,
'job_config': json.loads(build_obj.job_config) if can_write else None, 'job_config': json.loads(build_obj.job_config) if can_write else None,
@ -33,8 +48,9 @@ def build_status_view(build_obj, can_write=False):
'trigger': trigger_view(build_obj.trigger), 'trigger': trigger_view(build_obj.trigger),
'resource_key': build_obj.resource_key, 'resource_key': build_obj.resource_key,
} }
if can_write: if can_write:
resp['archive_url'] = user_files.get_file_url(build.resource_key) resp['archive_url'] = user_files.get_file_url(build_obj.resource_key)
return resp return resp
@ -63,9 +79,9 @@ class RepositoryBuildList(RepositoryParamResource):
}, },
} }
@require_repo_read
@parse_args @parse_args
@query_param('limit', 'The maximum number of builds to return', type=int, default=5) @query_param('limit', 'The maximum number of builds to return', type=int, default=5)
@require_repo_read
@nickname('getRepoBuilds') @nickname('getRepoBuilds')
def get(self, args, namespace, repository): def get(self, args, namespace, repository):
""" Get the list of repository builds. """ """ Get the list of repository builds. """

View file

@ -4,7 +4,8 @@ from collections import defaultdict
from flask.ext.restful import abort from flask.ext.restful import abort
from app import app from app import app
from endpoints.api import resource, nickname, require_repo_read, RepositoryParamResource from endpoints.api import (resource, nickname, require_repo_read, RepositoryParamResource,
format_date)
from data import model from data import model
from util.cache import cache_control_flask_restful from util.cache import cache_control_flask_restful
@ -20,7 +21,7 @@ def image_view(image):
command = extended_props.command command = extended_props.command
return { return {
'id': image.docker_image_id, 'id': image.docker_image_id,
'created': extended_props.created, 'created': format_date(extended_props.created),
'comment': extended_props.comment, 'comment': extended_props.comment,
'command': json.loads(command) if command else None, 'command': json.loads(command) if command else None,
'ancestors': image.ancestors, 'ancestors': image.ancestors,

View file

@ -4,7 +4,8 @@ from datetime import datetime, timedelta
from flask.ext.restful import abort from flask.ext.restful import abort
from endpoints.api import (resource, nickname, ApiResource, query_param, parse_args, from endpoints.api import (resource, nickname, ApiResource, query_param, parse_args,
RepositoryParamResource, require_repo_admin, related_user_resource) RepositoryParamResource, require_repo_admin, related_user_resource,
format_date)
from auth.permissions import AdministerOrganizationPermission, AdministerOrganizationPermission from auth.permissions import AdministerOrganizationPermission, AdministerOrganizationPermission
from auth.auth_context import get_authenticated_user from auth.auth_context import get_authenticated_user
from data import model from data import model
@ -15,7 +16,7 @@ def log_view(log):
'kind': log.kind.name, 'kind': log.kind.name,
'metadata': json.loads(log.metadata_json), 'metadata': json.loads(log.metadata_json),
'ip': log.ip, 'ip': log.ip,
'datetime': log.datetime, 'datetime': format_date(log.datetime),
} }
if log.performer: if log.performer:
@ -56,8 +57,8 @@ def get_logs(namespace, start_time, end_time, performer_name=None,
logs = model.list_logs(namespace, start_time, end_time, performer=performer, logs = model.list_logs(namespace, start_time, end_time, performer=performer,
repository=repository) repository=repository)
return { return {
'start_time': start_time, 'start_time': format_date(start_time),
'end_time': end_time, 'end_time': format_date(end_time),
'logs': [log_view(log) for log in logs] 'logs': [log_view(log) for log in logs]
} }

View file

@ -156,7 +156,7 @@ class RepositoryUserPermission(RepositoryParamResource):
@require_repo_admin @require_repo_admin
@nickname('deleteUserPermissions') @nickname('deleteUserPermissions')
def delete(namespace, repository, username): def delete(self, namespace, repository, username):
""" Delete the permission for the user. """ """ Delete the permission for the user. """
try: try:
model.delete_user_permission(username, namespace, repository) model.delete_user_permission(username, namespace, repository)

View file

@ -156,10 +156,8 @@ class PermissionPrototypeList(ApiResource):
delegate_username = delegate_name if delegate_kind == 'user' else None delegate_username = delegate_name if delegate_kind == 'user' else None
delegate_teamname = delegate_name if delegate_kind == 'team' else None delegate_teamname = delegate_name if delegate_kind == 'team' else None
activating_user = (model.get_user(activating_username) activating_user = (model.get_user(activating_username) if activating_username else None)
if activating_username else None) delegate_user = (model.get_user(delegate_username) if delegate_username else None)
delegate_user = (model.get_user(delegate_username)
if delegate_username else None)
delegate_team = (model.get_organization_team(orgname, delegate_teamname) delegate_team = (model.get_organization_team(orgname, delegate_teamname)
if delegate_teamname else None) if delegate_teamname else None)

View file

@ -37,7 +37,6 @@ class OrganizationTeam(ApiResource):
'description': 'Description of a team', 'description': 'Description of a team',
'required': [ 'required': [
'role', 'role',
'description',
], ],
'properties': { 'properties': {
'role': { 'role': {

View file

@ -10,7 +10,7 @@ from app import app
from endpoints.api import (RepositoryParamResource, nickname, resource, require_repo_admin, from endpoints.api import (RepositoryParamResource, nickname, resource, require_repo_admin,
log_action, request_error, query_param, parse_args, log_action, request_error, query_param, parse_args,
validate_json_request) validate_json_request)
from endpoints.api.build import build_status_view from endpoints.api.build import build_status_view, trigger_view
from endpoints.common import start_build from endpoints.common import start_build
from endpoints.trigger import (BuildTrigger, TriggerDeactivationException, from endpoints.trigger import (BuildTrigger, TriggerDeactivationException,
TriggerActivationException, EmptyRepositoryException) TriggerActivationException, EmptyRepositoryException)
@ -21,21 +21,6 @@ from auth.permissions import UserPermission
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def trigger_view(trigger):
if trigger and trigger.uuid:
config_dict = json.loads(trigger.config)
build_trigger = BuildTrigger.get_trigger_for_service(trigger.service.name)
return {
'service': trigger.service.name,
'config': config_dict,
'id': trigger.uuid,
'connected_user': trigger.connected_user.username,
'is_active': build_trigger.is_active(config_dict)
}
return None
def _prepare_webhook_url(scheme, username, password, hostname, path): def _prepare_webhook_url(scheme, username, password, hostname, path):
auth_hostname = '%s:%s@%s' % (quote(username), quote(password), hostname) auth_hostname = '%s:%s@%s' % (quote(username), quote(password), hostname)
return urlunparse((scheme, auth_hostname, path, '', '', '')) return urlunparse((scheme, auth_hostname, path, '', '', ''))

View file

@ -1,3 +1,5 @@
import json
from flask import request, url_for from flask import request, url_for
from flask.ext.restful import abort from flask.ext.restful import abort
@ -74,4 +76,4 @@ class Webhook(RepositoryParamResource):
log_action('delete_repo_webhook', namespace, log_action('delete_repo_webhook', namespace,
{'repo': repository, 'webhook_id': public_id}, {'repo': repository, 'webhook_id': public_id},
repo=model.get_repository(namespace, repository)) repo=model.get_repository(namespace, repository))
return make_response('No Content', 204) return 'No Content', 204

View file

@ -1450,7 +1450,7 @@ function LogUsageChart(titleMap) {
* Builds the D3-representation of the data. * Builds the D3-representation of the data.
*/ */
LogUsageChart.prototype.buildData_ = function(logs) { LogUsageChart.prototype.buildData_ = function(logs) {
var parseDate = d3.time.format("%a, %d %b %Y %H:%M:%S GMT").parse var parseDate = d3.time.format("%a, %d %b %Y %H:%M:%S %Z").parse
// Build entries for each kind of event that occurred, on each day. We have one // Build entries for each kind of event that occurred, on each day. We have one
// entry per {kind, day} pair. // entry per {kind, day} pair.

View file

@ -117,12 +117,12 @@ var isProd = document.location.hostname === 'quay.io';
<div class="col-md-8"> <div class="col-md-8">
<ul> <ul>
<li><span class="copyright">&copy;2014 DevTable, LLC</span></li> <li><span class="copyright">&copy;2014 DevTable, LLC</span></li>
<li><a href="http://blog.devtable.com/">Blog</a></li> <li><a href="http://blog.devtable.com/" target="_blank">Blog</a></li>
<li><a href="/tos" target="_self">Terms</a></li> <li><a href="/tos" target="_self">Terms</a></li>
<li><a href="/privacy" target="_self">Privacy</a></li> <li><a href="/privacy" target="_self">Privacy</a></li>
<li><a href="/security/">Security</a></li> <li><a href="/security/" target="_self">Security</a></li>
<li><a href="/about/">About</a></li> <li><a href="/about/" target="_self">About</a></li>
<li><b><a href="/contact/">Contact</a></b></li> <li><b><a href="/contact/" target="_self">Contact</a></b></li>
</ul> </ul>
</div> </div>