Skip to content
This repository has been archived by the owner on Apr 8, 2019. It is now read-only.

Commit

Permalink
Merge b93b348 into 700c53e
Browse files Browse the repository at this point in the history
  • Loading branch information
tarekziade committed Jun 23, 2017
2 parents 700c53e + b93b348 commit e42406e
Show file tree
Hide file tree
Showing 9 changed files with 126 additions and 4 deletions.
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ flask-pyoidc
Flask-WTF
PyYAML
humanize
boto3
-e git+https://github.com/tarekziade/restjson.git#egg=restjson
2 changes: 1 addition & 1 deletion serviceweb/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import logging

logger = logging.getLogger('servicebook')
__version__ = "0.1"
__version__ = "2.0"
7 changes: 7 additions & 0 deletions serviceweb/forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,3 +245,10 @@ def label(self, entry):


_FORMS['user'] = UserForm


class UploadForm(BaseForm):
file = fields.FileField()


_FORMS['upload'] = UploadForm
49 changes: 49 additions & 0 deletions serviceweb/screenshots.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import time
from functools import wraps
from contextlib import contextmanager
import boto3


@contextmanager
def s3bucket(name):
s3 = boto3.resource('s3')
bucket = s3.Bucket(name)
yield bucket, s3


def upload_file(project_id, filename, data, name='servicebook'):
key = '%s-%s' % (project_id, filename)
with s3bucket(name) as (bucket, s3):
data.seek(0)
bucket.upload_fileobj(data, key)
acl = s3.ObjectAcl(name, key)
acl.put(ACL='public-read')


_C = {}


def cached(name, max_age=60):
def _cached(func):
@wraps(func)
def __cached(*args, **kw):
if name in _C:
when, val = _C[name]
if time.time() - when < max_age:
return val
val = func(*args, **kw)
_C[name] = time.time(), val
return val
return __cached
return _cached


# XXX cache -- need a "has bucket changed?"
@cached('list')
def get_list(project_id, name='servicebook'):
keys = []
filter = str(project_id) + '-'
with s3bucket(name) as (bucket, s3):
for ob in bucket.objects.filter(Prefix=filter):
keys.append(ob.key)
return keys
3 changes: 2 additions & 1 deletion serviceweb/templates/_form.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<form id="{{form_id}}" action="{{form_action}}" method="POST">
<form id="{{form_id}}" action="{{form_action}}" method="POST"
enctype="multipart/form-data">
<input type="hidden" name="from_" value="{{from_}}"></input>
<input type="hidden" name="bust_cache" value="{{bust_cache}}"></input>
{{ form.csrf_token }}
Expand Down
28 changes: 28 additions & 0 deletions serviceweb/templates/project.html
Original file line number Diff line number Diff line change
Expand Up @@ -152,5 +152,33 @@ <h2 class="panel-title">{{deployment.name}} <span class="badge">v0.3.0</span>
</div>
{% endif %}
{% endfor %}

{% if screenshots %}
<h2>Screenshots</h2>
{% endif %}

<div class="row">
<div class="col-md-5">
{% for screenshot in screenshots %}
<div class="nailthumb-container" style="float: left; margin: 4px">
<a href="{{screenshot}}"><img src="{{screenshot}}"></img></a>
</div>
{% endfor %}
</div>
</div>

</div>
{% endblock %}

{% block scripts %}
{{super()}}
<script type="text/javascript" src="//www.garralab.com/projects/nailthumb/src/jquery.nailthumb.1.0.min.js"></script>

<script>
$(document).ready(function() {
$('.nailthumb-container').nailthumb({width:100,height:100});
});
</script>
{% endblock %}


3 changes: 2 additions & 1 deletion serviceweb/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from .groups import groups
from .edit import edit
from .heartbeat import heartbeat
from .upload import upload


blueprints = (users_bp, projects, auth, frontend, groups, edit,
heartbeat)
heartbeat, upload)
11 changes: 10 additions & 1 deletion serviceweb/views/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
import requests

from flask import render_template, abort, request, g, Blueprint
from botocore.auth import NoCredentialsError

from serviceweb.auth import only_for_editors
from serviceweb.forms import NewProjectForm, DeploymentForm
from serviceweb.util import add_view, safe_redirect
from serviceweb.screenshots import get_list
from restjson.client import objdict


Expand Down Expand Up @@ -86,9 +88,16 @@ def _api(depl):

backlink = '/'
edit = '/project/%d/edit' % project_id
try:
screenshots = ['https://s3-us-west-2.amazonaws.com/servicebook/' + key
for key in get_list(project_id)]
except NoCredentialsError:
screenshots = []

return render_template('project.html', project=project, bugs=bugs,
edit=edit, jenkins_builds=builds,
project_info=project_info, backlink=backlink)
project_info=project_info, backlink=backlink,
screenshots=screenshots)


@projects.route("/project/<int:project_id>/deployments",
Expand Down
26 changes: 26 additions & 0 deletions serviceweb/views/upload.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from flask import redirect, Blueprint, request
from flask import render_template

from serviceweb.auth import only_for_editors
from serviceweb.forms import get_form
from serviceweb.screenshots import upload_file


upload = Blueprint('upload', __name__)


@upload.route("/project/<int:project_id>/upload",
methods=['POST', 'GET'])
@only_for_editors
def _upload_screenshot(project_id):
backlink = "/project/%d" % project_id
if request.method == 'POST':
data_file = request.files.get('file')
file_name = data_file.filename
upload_file(project_id, file_name, data_file)
return redirect(backlink)
else:
form = get_form('upload')(request.form)
action = "Upload screenshot"
return render_template("edit.html", form=form, action=action,
backlink=backlink, form_id='upload')

0 comments on commit e42406e

Please sign in to comment.