1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
import shutil
import os
import zipfile
import tempfile
import csv
from django.template import Context, Template
def copy_files(file_paths):
""" Copy Files to current directory, takes
tuple with file paths and extract status"""
files = []
for src in file_paths:
file_path, extract = src
file_name = os.path.basename(file_path)
files.append(file_name)
shutil.copy(file_path, os.getcwd())
if extract:
z_files, path = extract_files(file_name, os.getcwd())
for file in z_files:
files.append(file)
return files
def delete_files(files, file_path=None):
""" Delete Files from directory """
for file_name in files:
if file_path:
file = os.path.join(file_path, file_name)
else:
file = file_name
if os.path.exists(file):
if os.path.isfile(file):
os.remove(file)
else:
shutil.rmtree(file)
def extract_files(zip_file, path=None):
""" extract files from zip """
zfiles = []
if zipfile.is_zipfile(zip_file):
zip_file = zipfile.ZipFile(zip_file, 'r')
for z_file in zip_file.namelist():
zfiles.append(z_file)
if path:
extract_path = path
else:
extract_path = tempfile.mkdtemp()
zip_file.extractall(extract_path)
zip_file.close()
return zfiles, extract_path
def is_csv(document):
''' Check if document is csv with ',' as the delimiter'''
try:
try:
content = document.read(1024).decode('utf-8')
except AttributeError:
document.seek(0)
content = document.read(1024)
sniffer = csv.Sniffer()
dialect = sniffer.sniff(content, delimiters=',')
document.seek(0)
except (csv.Error, UnicodeDecodeError):
return False, None
return True, dialect
def write_static_files_to_zip(zipfile, course_name, current_dir, static_files):
""" Write static files to zip
Parameters
----------
zipfile : Zipfile object
zip file in which the static files need to be added
course_name : str
Create a folder with course name
current_dir: str
Path from which the static files will be taken
static_files: dict
Dictionary containing static folders as keys and static files as
values
"""
for folder in static_files.keys():
folder_path = os.sep.join((current_dir, "static", "yaksh", folder))
for file in static_files[folder]:
file_path = os.sep.join((folder_path, file))
with open(file_path, "rb") as f:
zipfile.writestr(
os.sep.join((course_name, "static", folder, file)),
f.read()
)
def write_templates_to_zip(zipfile, template_path, data, filename, filepath):
""" Write template files to zip
Parameters
----------
zipfile : Zipfile object
zip file in which the template files need to be added
template_path : str
Path from which the template file will be loaded
data: dict
Dictionary containing context data required for template
filename: str
Filename with which the template file should be named
filepath: str
File path in zip where the template will be added
"""
rendered_template = render_template(template_path, data)
zipfile.writestr(os.sep.join((filepath, "{0}.html".format(filename))),
str(rendered_template))
def render_template(template_path, data):
with open(template_path) as f:
template_data = f.read()
template = Template(template_data)
context = Context(data)
render = template.render(context)
return render
|