Skip to content

Commit fd602f9

Browse files
Johnetordofffelliott
authored andcommitted
add zip rendering and tests
* Render .zip files as a listing of the contents. Each entry includes the name, timestamp, and size of the file. macOS-specific directories are excluded from the listing. [SVCS-248]
1 parent aa20d75 commit fd602f9

File tree

11 files changed

+172
-2
lines changed

11 files changed

+172
-2
lines changed

dev-requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
-r requirements.txt
22

33
-e git+https://github.com/centerforopenscience/aiohttpretty.git@0.0.2#egg=aiohttpretty
4+
beautifulsoup4
45
colorlog==2.5.0
56
flake8==3.0.4
67
ipdb

mfr/core/utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ def make_renderer(name, metadata, file_path, url, assets_url, export_url):
9898
)
9999

100100
def sizeof_fmt(num, suffix='B'):
101+
if abs(num) < 1000:
102+
return '%3.0f%s' % (num, suffix)
103+
101104
for unit in ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z']:
102105
if abs(num) < 1000.0:
103106
return '%3.1f%s%s' % (num, unit, suffix)

mfr/extensions/zip/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .render import ZipRenderer # noqa

mfr/extensions/zip/render.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import os
2+
import zipfile
3+
4+
import markupsafe
5+
from mako.lookup import TemplateLookup
6+
7+
from mfr.core import extension
8+
from mfr.core.utils import sizeof_fmt
9+
10+
11+
class ZipRenderer(extension.BaseRenderer):
12+
13+
TEMPLATE = TemplateLookup(
14+
directories=[
15+
os.path.join(os.path.dirname(__file__), 'templates')
16+
]).get_template('viewer.mako')
17+
18+
def render(self):
19+
zip_file = zipfile.ZipFile(self.file_path, 'r')
20+
21+
filelist = [{'name': markupsafe.escape(file.filename),
22+
'size': sizeof_fmt(int(file.file_size)),
23+
'date': "%d-%02d-%02d %02d:%02d:%02d" % file.date_time[:6]} for file in zip_file.filelist
24+
if not file.filename.startswith('__MACOSX')]
25+
26+
message = '' if filelist else 'This zip file is empty.'
27+
28+
return self.TEMPLATE.render(zipped_filenames=filelist, message=message)
29+
30+
@property
31+
def file_required(self):
32+
return True
33+
34+
@property
35+
def cache_result(self):
36+
return True
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,600,300,700" rel="stylesheet" type="text/css">
2+
<link rel="stylesheet" href="static/css/bootstrap.min.css">
3+
<link rel="stylesheet" href="static/css/default.css">
4+
<div style="word-wrap: break-word;" class="mfrViewer">
5+
<h1>
6+
Zip File:
7+
</h1>
8+
<p>
9+
Download the .zip file to view the contents.
10+
</p>
11+
${message}
12+
<table class="table table-hover">
13+
<thead>
14+
<th>File Name</th>
15+
<th>Modified</th>
16+
<th>Size</th>
17+
</thead>
18+
<tbody>
19+
% for file in zipped_filenames:
20+
<tr>
21+
<td>${file['name']}</td>
22+
<td>${file['date']}</td>
23+
<td>${file['size']}<td>
24+
</tr>
25+
% endfor
26+
</tbody>
27+
</table>
28+
</div>
29+
30+
<script src="/static/js/mfr.js"></script>
31+
<script src="/static/js/mfr.child.js"></script>

mfr/settings.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,12 @@ def child(self, key):
8585
UNSUPPORTED_RENDER_MSG = 'Viewing of this file type is not currently supported. Please download the file to view.'
8686

8787

88-
MAX_FILE_SIZE_TO_RENDER = {'.csv': 100000000, '.xlsx': 1000000000, '.tsv': 1000000000, '.sav': 1000000000, '.xls': 1000000000}
88+
MAX_FILE_SIZE_TO_RENDER = {'.csv': 100000000,
89+
'.xlsx': 1000000000,
90+
'.tsv': 1000000000,
91+
'.sav': 1000000000,
92+
'.xls': 1000000000,
93+
'.zip': 1000000000}
8994

9095
try:
9196
import colorlog # noqa

setup.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,10 @@ def parse_requirements(requirements):
791791
'.webm = mfr.extensions.video:VideoRenderer',
792792

793793
# JASP
794-
'.jasp = mfr.extensions.jasp:JASPRenderer'
794+
'.jasp = mfr.extensions.jasp:JASPRenderer',
795+
796+
# Zip
797+
'.zip = mfr.extensions.zip:ZipRenderer'
795798
]
796799
},
797800
)

tests/extensions/zip/__init__.py

Whitespace-only changes.
22 Bytes
Binary file not shown.
4.08 KB
Binary file not shown.

0 commit comments

Comments
 (0)