Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
24bd073
Create new copydoc file if webpage is new
samhotep Sep 30, 2024
1cdd670
conditionally create a new folder
samhotep Sep 30, 2024
d5a58aa
Fixed linter issues
samhotep Sep 30, 2024
dc95eea
Updated requirements
samhotep Sep 30, 2024
f09f131
Put copydoc in subfolder
samhotep Sep 30, 2024
5488028
Use hardcoded values for the google drive folder and copydoc template
samhotep Sep 30, 2024
db773b6
Store credentials in a temp file
samhotep Sep 30, 2024
afaee11
Moved google creds to env variable
samhotep Oct 1, 2024
c8246a6
Use demo database URL
samhotep Oct 1, 2024
4311ff9
Reformat site.yaml
samhotep Oct 1, 2024
faf111b
Point production to dedicated db
samhotep Oct 1, 2024
ee921a3
Removed secret key definition
samhotep Oct 2, 2024
02682bb
Updated demo secrets
samhotep Oct 2, 2024
33a37be
Moved drive env variables to settings
samhotep Oct 2, 2024
3f22c42
Removed redundant code
samhotep Oct 2, 2024
1ee286d
Updated google drive module
samhotep Oct 7, 2024
a0047b2
Use physical creds
samhotep Oct 7, 2024
13eb0f5
Removed service account env variable
samhotep Oct 7, 2024
c1ce393
Pass only private key as env
samhotep Oct 8, 2024
471bd36
declared env variables explicitly for python ci
samhotep Oct 8, 2024
c401f38
dont duplicate subfolders
samhotep Oct 8, 2024
ce84b45
Added private key to demo
samhotep Oct 8, 2024
39db5be
Returned file url after copydoc creation
samhotep Oct 8, 2024
99410c0
Use explicit naming for private keys
samhotep Oct 8, 2024
e410d2b
Merge branch 'main' into create-copydocs-endpoint
samhotep Oct 8, 2024
3447d26
Update CI.yml
samhotep Oct 8, 2024
1642cbe
Added env variables to playwright
samhotep Oct 8, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ click==8.1.7
django-openid-auth==0.17
Flask==2.3.3
Flask-OpenID==1.3.1
google-api-python-client==2.78.0
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.5
Expand Down
123 changes: 123 additions & 0 deletions webapp/gdrive.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import base64
import os
import tempfile

from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


class GoogleDriveClient:
# If modifying these scopes, delete the file token.json.
SCOPES = [
"https://www.googleapis.com/auth/drive.metadata.readonly",
"https://www.googleapis.com/auth/drive.file",
]
GOOGLE_DRIVE_FOLDER_ID = (
"0B4s80tIYQW4BMjNiMGFmNzQtNDkxZC00YmQ0LWJiZWUtNTk2YThlY2MzZmJh"
)
COPYD0C_TEMPLATE_ID = "1EPA_Ea8ShIvyftAc9oVxZYUIMHfAPFF6S5x6FOvLkwM"

def __init__(self):
self.credentials = self._get_credentials()
self.service = self._build_service()

def _get_credentials(self):
"""
Load credentials from a base64 encoded environment variable.
"""
credentials_text = os.getenv("GOOGLE_SERVICE_ACCOUNT")
with tempfile.NamedTemporaryFile(delete_on_close=False) as f:
f.write(base64.decode(credentials_text))
f.close()

return service_account.Credentials.from_service_account_file(
f.name,
scopes=self.SCOPES,
)

def _build_service(self):
return build("drive", "v3", credentials=self.credentials)

def create_copydoc_from_template(self, webpage):
"""
Create a copydoc from a template. The document is created in the folder
for the webpage project.
"""
parents = [self.GOOGLE_DRIVE_FOLDER_ID]
# Create a folder if it does not exist
if not self.find_folder(webpage.project.name):
parents = [self.create_folder(webpage.project.name)]
try:
copy_metadata = {
"name": webpage.url,
"parents": parents,
}
copy = (
self.service.files()
.copy(
fileId=self.COPYD0C_TEMPLATE_ID,
body=copy_metadata,
)
.execute()
)
return copy
except HttpError as error:
print(f"An error occurred: {error}")
return None

def create_folder(self, name):
"""
Create a folder in the Google Drive.
"""
try:
folder_metadata = {
"name": name,
"mimeType": "application/vnd.google-apps.folder",
"parents": [self.GOOGLE_DRIVE_FOLDER_ID],
}
folder = (
self.service.files()
.create(body=folder_metadata, fields="id")
.execute()
)
return folder
except HttpError as error:
print(f"An error occurred: {error}")
return None

def find_folder(service, folder_name):
"""
Check if a folder with the given name exists in Google Drive, to
prevent creating duplicate folders.
"""
query = (
f"name = '{folder_name}' and mimeType = "
"'application/vnd.google-apps.folder' and trashed = false"
)
results = (
service.files()
.list(
q=query, spaces="drive", fields="files(id, name)", pageSize=10
)
.execute()
)

items = results.get("files", [])
return items

def list_files(self, page_size=10):
try:
results = (
self.service.files()
.list(
pageSize=page_size,
fields="nextPageToken, files(id, name)",
)
.execute()
)
items = results.get("files", [])
return items
except HttpError as error:
print(f"An error occurred: {error}")
return None
9 changes: 8 additions & 1 deletion webapp/helper.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from webapp.models import JiraTask, User, db, get_or_create
from webapp.gdrive import GoogleDriveClient
from webapp.models import JiraTask, User, Webpage, db, get_or_create


def get_or_create_user_id(user):
Expand Down Expand Up @@ -43,3 +44,9 @@ def create_jira_task(app, task):
webpage_id=task["webpage_id"],
user_id=task["reporter_id"],
)

# Create a new copydoc if the request is a new webpage
if task["type"] == jira.NEW_WEBPAGE:
webpage = Webpage.query.filter_by(id=task["webpage_id"]).first()
client = GoogleDriveClient()
client.create_copydoc_from_template(webpage)
Loading