Skip to content

Commit

Permalink
Update/fix research views
Browse files Browse the repository at this point in the history
  • Loading branch information
gthole committed Jan 10, 2018
1 parent 2936ea4 commit 9d5e789
Show file tree
Hide file tree
Showing 13 changed files with 292 additions and 141 deletions.
5 changes: 5 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*.py[co]
settings_local.py
*.ged
/tmp
/files
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,4 @@ pip-log.txt
/files/
*.ged
settings_local.py
/tmp
8 changes: 2 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
FROM python:2.7

COPY ./ /src/
COPY ./ /app/

WORKDIR /src/
WORKDIR /app/
RUN pip install -r reqs.pip

RUN adduser --disabled-password --gecos '' gedgo
RUN chown -R gedgo:gedgo /src
USER gedgo
115 changes: 60 additions & 55 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,55 +1,60 @@
# Dev services
avahi:
container_name: 'avahi'
image: 'enernoclabs/avahi:latest'
net: 'host'
log_driver: 'none'
db:
container_name: 'db'
image: 'mysql'
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: 'docker'
MYSQL_DATABASE: 'gedgo'
MYSQL_USER: 'gedgo'
MYSQL_PASSWORD: 'gedgo'
log_driver: 'none'
redis:
container_name: 'redis'
image: 'redis'
ports:
- '6379'
log_driver: 'none'
# Application
app:
build: '.'
container_name: 'gedgo_app'
command: ['python', 'manage.py', 'runserver', '0.0.0.0:8000']
volumes:
- './:/src'
ports:
- '8000:8000'
links:
- 'db'
- 'redis'
web:
image: 'nginx'
command: 'nginx -g "daemon off;"'
volumes:
- './gedgo-web.conf:/etc/nginx/conf.d/gedgo-web.conf:ro'
- './files:/src/files:ro'
ports:
- '80:80'
links:
- 'app'
worker:
container_name: 'gedgo_worker'
image: 'gedgo_app'
command: ['python', 'manage.py', 'celeryd', '-c', '1', '--loglevel=info']
volumes:
- './:/src'
links:
- 'app'
- 'db'
- 'redis'
version: '2.2'
services:
# Dev services
avahi:
container_name: 'avahi'
image: 'enernoclabs/avahi:latest'
network_mode: 'host'
logging:
driver: 'none'
db:
container_name: 'db'
image: 'mysql'
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: 'docker'
MYSQL_DATABASE: 'gedgo'
MYSQL_USER: 'gedgo'
MYSQL_PASSWORD: 'gedgo'
logging:
driver: 'none'
redis:
container_name: 'redis'
image: 'redis'
ports:
- '6379'
logging:
driver: 'none'
# Application
app:
build: '.'
container_name: 'gedgo_app'
command: ['python', 'manage.py', 'runserver', '0.0.0.0:8000']
volumes:
- './:/app'
links:
- 'db'
- 'redis'
web:
image: 'nginx'
command: 'nginx -g "daemon off;"'
volumes:
- './gedgo-web.conf:/etc/nginx/conf.d/gedgo-web.conf:ro'
- './files:/src/files:ro'
ports:
- '80:80'
links:
- 'app'
worker:
container_name: 'gedgo_worker'
image: 'gedgo_app'
command: ['python', 'manage.py', 'celeryd', '-c', '1', '--loglevel=info']
volumes:
- './:/app'
links:
- 'app'
- 'db'
- 'redis'
depends_on:
- 'app'
16 changes: 11 additions & 5 deletions gedgo/gedcom_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,13 @@ def update(g, file_name, verbose=True):
title=__child_value_by_tags(parsed.header, 'TITL', default=''),
last_updated=datetime(1920, 1, 1) # TODO: Fix.
)
print g.id

if verbose:
print 'Importing entries to models'
person_counter = family_counter = note_counter = 0
for entry in parsed.entries.values():
entries = parsed.entries.values()
for index, entry in enumerate(entries):
tag = entry['tag']

if tag == 'INDI':
Expand All @@ -44,6 +46,9 @@ def update(g, file_name, verbose=True):
__process_Note(entry, g)
note_counter += 1

if (index + 1) % 100 == 0:
print ' ... %d / %d' % (index + 1, len(entries))

if verbose:
print 'Found %d people, %d families, %d notes, and %d documents' % (
person_counter, family_counter, note_counter,
Expand All @@ -64,8 +69,9 @@ def __process_all_relations(gedcom, parsed, verbose=True):
print ' Starting Person objects.'

# Process Person objects
for person in gedcom.person_set.iterator():
for index, person in enumerate(gedcom.person_set.iterator()):
entry = parsed.entries.get(person.pointer)
print index
if entry is not None:
__process_person_relations(gedcom, person, entry)
else:
Expand Down Expand Up @@ -256,7 +262,7 @@ def __process_Document(entry, obj, g):
m.docfile.name = file_name
if kind == 'PHOTO':
try:
make_thumbnail(name)
make_thumbnail(name, __child_value_by_tags(entry, 'CROP'))
thumb = path.join('default/thumbs', name)
except:
print ' Warning: failed to make or find thumbnail: %s' % name
Expand Down Expand Up @@ -362,7 +368,7 @@ def __valid_document_entry(e):
return name


def make_thumbnail(name):
def make_thumbnail(name, crop):
"""
Copies an image from gedcom_storage, converts it to a thumbnail, and saves
it to default_storage for fast access
Expand All @@ -375,7 +381,7 @@ def make_thumbnail(name):
im = Image.open(gedcom_storage.open(name))
width, height = im.size

# TODO: Use gedcom _CROP attribute to set the box
# TODO: Use crop argument
if width > height:
offset = (width - height) / 2
box = (offset, 0, offset + height, height)
Expand Down
3 changes: 3 additions & 0 deletions gedgo/static/styles/style-default.css
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ body {
margin-left: auto;
margin-right: auto;
max-width: 100%;
min-width: 100%;
min-height: 100%;
max-height: 100%;
margin-bottom: 10px;
}
.subsection-thumb {
Expand Down
56 changes: 35 additions & 21 deletions gedgo/storages.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,53 +3,70 @@
from django.conf import settings
from django.utils.module_loading import import_string

from cStringIO import StringIO
import os
from dropbox.client import DropboxClient
from dropbox.dropbox import Dropbox
from dropbox.files import FileMetadata, FolderMetadata, ThumbnailFormat, \
ThumbnailSize


class DropboxStorage(Storage):
def __init__(self, *args, **kwargs):
self.client = DropboxClient(settings.DROPBOX_ACCESS_TOKEN)
self.client = Dropbox(settings.DROPBOX_ACCESS_TOKEN)
self.location = kwargs.get('location', settings.MEDIA_ROOT)

def path(self, name):
return safe_join(self.location, name)

def exists(self, name):
try:
return isinstance(self.client.metadata(self.path(name)), dict)
return isinstance(
self.client.files_get_metadata(self.path(name)),
(FileMetadata, FolderMetadata)
)
except:
return False

def listdir(self, name):
meta = self.client.metadata(self.path(name))
return self._list_from_contents(self.path(name), meta['contents'])
result = self.client.files_list_folder(self.path(name))
return self._list_from_contents(self.path(name), result.entries)

def _list_from_contents(self, path, contents):
directories, files = [], []
for entry in contents:
name = entry['path'][len(path) + 1:]
if entry['is_dir']:
directories.append(name)
else:
files.append(name)
if isinstance(entry, FileMetadata):
files.append(entry.name)
if isinstance(entry, FolderMetadata):
directories.append(entry.name)
return (directories, files)

def open(self, name, mode='rb'):
return self.client.get_file(self.path(name))
meta, resp= self.client.files_download(self.path(name))
return resp.raw

def size(self, name):
return self.client.metadata(self.path(name)).bytes
return self.client.files_get_metadata(self.path(name)).size

def url(self, name):
return self.client.media(self.path(name))['url']
url = self.client.files_get_temporary_link(self.path(name)).link
return url

def search(self, query, name=''):
contents = self.client.search(self.path(name), query)
return self._list_from_contents(self.path(name), contents)
def search(self, query, name='', start=0):
result = self.client.files_search(self.path(name), query, start)
directories, files = [], []
for entry in result.matches:
if isinstance(entry.metadata, FileMetadata):
p = entry.metadata.path_display[len(self.location):]
files.append(p)
# Ignore directories for now
return (directories, files)

def preview(self, name):
return self.client.thumbnail(self.path(name), 's')
def preview(self, name, size='w64h64'):
return StringIO(self.client.files_get_thumbnail(
self.path(name),
format=ThumbnailFormat('jpeg', None),
size=ThumbnailSize(size, None)
)[1].content)


class ResearchFileSystemStorage(FileSystemStorage):
Expand All @@ -63,9 +80,6 @@ def search(self, query):
files.append(os.path.join(r, f))
return directories, files

def preview(self, path):
raise NotImplementedError


research_storage = import_string(settings.GEDGO_RESEARCH_FILE_STORAGE)(
location=settings.GEDGO_RESEARCH_FILE_ROOT)
Expand Down
23 changes: 13 additions & 10 deletions gedgo/templates/default/research.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<ul class="nav bs-sidenav">
{% for name, path in levels %}
<li>
<a {% if forloop.last %}style="color: #000"{% else %}href="/gedgo/research{{ path }}"{% endif %}>{{ name|truncatechars:20 }}/</a>
<a {% if forloop.last %}style="color: #000"{% else %}href="/gedgo/research{{ path | urlencode }}"{% endif %}>{{ name }}</a>
</li>
{% endfor %}
</ul>
Expand All @@ -18,25 +18,26 @@
<hr>
<form>
<form class="navbar-form navbar-right" action="/gedgo/search/" method="get">
<input type="text" class="form-control" name="rq" value="{% if rquery %}{{ rquery }}{% endif %}" placeholder="search this folder">
<input type="text" class="form-control" name="rq" value="{% if rq %}{{ rq }}{% endif %}" placeholder="search this folder">
</form>
{% if rquery %}<a href="/gedgo/research/{{ pathname }}"><i class="fa fa-times"></i> clear</a>{% endif %}
{% if rq %}<a href="/gedgo/research/{{ dirname | urlencode }}"><i class="fa fa-times"></i> clear</a>{% endif %}

</form>
{% endif %}
<br />
{% endblock %}

{% block content %}
{% if levels|length > 1 %}
<a class="btn btn-info visible-xs" href=".">Up a level</a>

{% if not directories and not files %}
<span class="text-muted">No files here.</span>
{% endif %}
<h3>{{ current_level }}</h3>

{% if directories %}
<ul class="list-group">
{% for dir in directories %}
<li class="list-group-item">
<a href="/gedgo/research/{{ dir.path }}">
<a href="/gedgo/research/{{ dir.full_path | urlencode }}/">
<div class="row">
<div class="col-xs-2 text-center">
<i class="fa fa-folder-open fa-2x"></i>
Expand All @@ -50,17 +51,19 @@ <h3>{{ current_level }}</h3>
{% endfor %}
</ul>
{% endif %}

{% if directories and files %}
<hr />
{% endif %}

{% if files %}
<ul class="list-group">
{% for f in files %}
<li class="list-group-item">
<a href="/gedgo/research/{{ f.path }}">
<li class="list-group-item" style="min-height: 64px">
<a href="/gedgo/research/{{ dirname | urlencode }}?fn={{ f.path | urlencode }}{% if rq %}&rq={{ rq }}{% endif %}">
<div class="row">
<div class="col-xs-2 text-center">
{% if f.preview %}<img class="center-block" src="/gedgo/research-preview/{{ f.path }}">
{% if f.preview %}<img style="max-width: 64px" class="center-block" src="/gedgo/research-preview/{{ dirname | urlencode }}/{{ f.path | urlencode }}">
{% else %}<i class="fa fa-{{ f.type }} fa-2x"></i>
{% endif %}
</div>
Expand Down
Loading

0 comments on commit 9d5e789

Please sign in to comment.