Compare commits

..

No commits in common. "c9cbb53eea6ba2d9a15ceaa53fbddd2895f8694c" and "cf9c4f0e85a20f19acc42d16221b1dd2013cad70" have entirely different histories.

44 changed files with 735 additions and 70 deletions

BIN
app.db

Binary file not shown.

BIN
app.db.old Normal file

Binary file not shown.

@ -1 +1 @@
Subproject commit f94c64e699e29cac8c707337e219ada64a1ae01e Subproject commit 060e506547778df6914f848e6e21d719a47a9446

View File

@ -0,0 +1,84 @@
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly
if [ "${BASH_SOURCE-}" = "$0" ]; then
echo "You must source this script: \$ source $0" >&2
exit 33
fi
deactivate () {
unset -f pydoc >/dev/null 2>&1
# reset old environment variables
# ! [ -z ${VAR+_} ] returns true if VAR is declared at all
if ! [ -z "${_OLD_VIRTUAL_PATH:+_}" ] ; then
PATH="$_OLD_VIRTUAL_PATH"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then
PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
hash -r 2>/dev/null
fi
if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then
PS1="$_OLD_VIRTUAL_PS1"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset VIRTUAL_ENV
if [ ! "${1-}" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
# unset irrelevant variables
deactivate nondestructive
VIRTUAL_ENV='/home/raphael/dev/git/calendarwatch_frontend/calendarwatch'
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
# unset PYTHONHOME if set
if ! [ -z "${PYTHONHOME+_}" ] ; then
_OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
unset PYTHONHOME
fi
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
_OLD_VIRTUAL_PS1="${PS1-}"
if [ "x" != x ] ; then
PS1="${PS1-}"
else
PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}"
fi
export PS1
fi
# Make sure to unalias pydoc if it's already there
alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true
pydoc () {
python -m pydoc "$@"
}
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
hash -r 2>/dev/null
fi

View File

@ -0,0 +1,55 @@
# This file must be used with "source bin/activate.csh" *from csh*.
# You cannot run it directly.
# Created by Davide Di Blasi <davidedb@gmail.com>.
set newline='\
'
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc'
# Unset irrelevant variables.
deactivate nondestructive
setenv VIRTUAL_ENV '/home/raphael/dev/git/calendarwatch_frontend/calendarwatch'
set _OLD_VIRTUAL_PATH="$PATH:q"
setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q"
if ('' != "") then
set env_name = ''
else
set env_name = '('"$VIRTUAL_ENV:t:q"') '
endif
if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then
if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then
set do_prompt = "1"
else
set do_prompt = "0"
endif
else
set do_prompt = "1"
endif
if ( $do_prompt == "1" ) then
# Could be in a non-interactive environment,
# in which case, $prompt is undefined and we wouldn't
# care about the prompt anyway.
if ( $?prompt ) then
set _OLD_VIRTUAL_PROMPT="$prompt:q"
if ( "$prompt:q" =~ *"$newline:q"* ) then
:
else
set prompt = "$env_name:q$prompt:q"
endif
endif
endif
unset env_name
unset do_prompt
alias pydoc python -m pydoc
rehash

View File

@ -0,0 +1,100 @@
# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*.
# Do not run it directly.
function _bashify_path -d "Converts a fish path to something bash can recognize"
set fishy_path $argv
set bashy_path $fishy_path[1]
for path_part in $fishy_path[2..-1]
set bashy_path "$bashy_path:$path_part"
end
echo $bashy_path
end
function _fishify_path -d "Converts a bash path to something fish can recognize"
echo $argv | tr ':' '\n'
end
function deactivate -d 'Exit virtualenv mode and return to the normal environment.'
# reset old environment variables
if test -n "$_OLD_VIRTUAL_PATH"
# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling
if test (echo $FISH_VERSION | head -c 1) -lt 3
set -gx PATH (_fishify_path "$_OLD_VIRTUAL_PATH")
else
set -gx PATH "$_OLD_VIRTUAL_PATH"
end
set -e _OLD_VIRTUAL_PATH
end
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
set -gx PYTHONHOME "$_OLD_VIRTUAL_PYTHONHOME"
set -e _OLD_VIRTUAL_PYTHONHOME
end
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
and functions -q _old_fish_prompt
# Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`.
set -l fish_function_path
# Erase virtualenv's `fish_prompt` and restore the original.
functions -e fish_prompt
functions -c _old_fish_prompt fish_prompt
functions -e _old_fish_prompt
set -e _OLD_FISH_PROMPT_OVERRIDE
end
set -e VIRTUAL_ENV
if test "$argv[1]" != 'nondestructive'
# Self-destruct!
functions -e pydoc
functions -e deactivate
functions -e _bashify_path
functions -e _fishify_path
end
end
# Unset irrelevant variables.
deactivate nondestructive
set -gx VIRTUAL_ENV '/home/raphael/dev/git/calendarwatch_frontend/calendarwatch'
# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling
if test (echo $FISH_VERSION | head -c 1) -lt 3
set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH)
else
set -gx _OLD_VIRTUAL_PATH "$PATH"
end
set -gx PATH "$VIRTUAL_ENV"'/bin' $PATH
# Unset `$PYTHONHOME` if set.
if set -q PYTHONHOME
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
set -e PYTHONHOME
end
function pydoc
python -m pydoc $argv
end
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
# Copy the current `fish_prompt` function as `_old_fish_prompt`.
functions -c fish_prompt _old_fish_prompt
function fish_prompt
# Run the user's prompt first; it might depend on (pipe)status.
set -l prompt (_old_fish_prompt)
# Prompt override provided?
# If not, just prepend the environment name.
if test -n ''
printf '%s%s' '' (set_color normal)
else
printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV")
end
string join -- \n $prompt # handle multi-line prompts
end
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
end

View File

@ -0,0 +1,60 @@
$script:THIS_PATH = $myinvocation.mycommand.path
$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent
function global:deactivate([switch] $NonDestructive) {
if (Test-Path variable:_OLD_VIRTUAL_PATH) {
$env:PATH = $variable:_OLD_VIRTUAL_PATH
Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global
}
if (Test-Path function:_old_virtual_prompt) {
$function:prompt = $function:_old_virtual_prompt
Remove-Item function:\_old_virtual_prompt
}
if ($env:VIRTUAL_ENV) {
Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue
}
if (!$NonDestructive) {
# Self destruct!
Remove-Item function:deactivate
Remove-Item function:pydoc
}
}
function global:pydoc {
python -m pydoc $args
}
# unset irrelevant variables
deactivate -nondestructive
$VIRTUAL_ENV = $BASE_DIR
$env:VIRTUAL_ENV = $VIRTUAL_ENV
New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH
$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH
if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) {
function global:_old_virtual_prompt {
""
}
$function:_old_virtual_prompt = $function:prompt
if ("" -ne "") {
function global:prompt {
# Add the custom prefix to the existing prompt
$previous_prompt_value = & $function:_old_virtual_prompt
("" + $previous_prompt_value)
}
}
else {
function global:prompt {
# Add a prefix to the current prompt, but don't discard it.
$previous_prompt_value = & $function:_old_virtual_prompt
$new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) "
($new_prompt_value + $previous_prompt_value)
}
}
}

View File

@ -0,0 +1,46 @@
"""Xonsh activate script for virtualenv"""
from xonsh.tools import get_sep as _get_sep
def _deactivate(args):
if "pydoc" in aliases:
del aliases["pydoc"]
if ${...}.get("_OLD_VIRTUAL_PATH", ""):
$PATH = $_OLD_VIRTUAL_PATH
del $_OLD_VIRTUAL_PATH
if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""):
$PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME
del $_OLD_VIRTUAL_PYTHONHOME
if "VIRTUAL_ENV" in ${...}:
del $VIRTUAL_ENV
if "VIRTUAL_ENV_PROMPT" in ${...}:
del $VIRTUAL_ENV_PROMPT
if "nondestructive" not in args:
# Self destruct!
del aliases["deactivate"]
# unset irrelevant variables
_deactivate(["nondestructive"])
aliases["deactivate"] = _deactivate
$VIRTUAL_ENV = r"/home/raphael/dev/git/calendarwatch_frontend/calendarwatch"
$_OLD_VIRTUAL_PATH = $PATH
$PATH = $PATH[:]
$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True)
if ${...}.get("PYTHONHOME", ""):
# unset PYTHONHOME if set
$_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME
del $PYTHONHOME
$VIRTUAL_ENV_PROMPT = ""
if not $VIRTUAL_ENV_PROMPT:
del $VIRTUAL_ENV_PROMPT
aliases["pydoc"] = ["python", "-m", "pydoc"]

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
"""Activate virtualenv for current interpreter:
Use exec(open(this_file).read(), {'__file__': this_file}).
This can be used when you must use an existing Python interpreter, not the virtualenv bin/python.
"""
import os
import site
import sys
try:
abs_file = os.path.abspath(__file__)
except NameError:
raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))")
bin_dir = os.path.dirname(abs_file)
base = bin_dir[: -len("bin") - 1] # strip away the bin part from the __file__, plus the path separator
# prepend bin to PATH (this file is inside the bin directory)
os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep))
os.environ["VIRTUAL_ENV"] = base # virtual env is right above bin directory
# add the virtual environments libraries to the host python import mechanism
prev_length = len(sys.path)
for lib in "../lib/python3.7/site-packages".split(os.pathsep):
path = os.path.realpath(os.path.join(bin_dir, lib))
site.addsitedir(path.decode("utf-8") if "" else path)
sys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length]
sys.real_prefix = sys.prefix
sys.prefix = base

8
calendarwatch/bin/alembic Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from alembic.config import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/chardetect Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from chardet.cli.chardetect import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/dotenv Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from dotenv.cli import cli
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(cli())

8
calendarwatch/bin/easy_install Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from email_validator import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/flask Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from flask.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

137
calendarwatch/bin/google Executable file
View File

@ -0,0 +1,137 @@
#!/usr/bin/python
# Python bindings to the Google search engine
# Copyright (c) 2009-2019, Mario Vilas
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice,this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
import sys
from googlesearch import search, get_random_user_agent
# TODO port to argparse
from optparse import OptionParser, IndentedHelpFormatter
class BannerHelpFormatter(IndentedHelpFormatter):
"Just a small tweak to optparse to be able to print a banner."
def __init__(self, banner, *argv, **argd):
self.banner = banner
IndentedHelpFormatter.__init__(self, *argv, **argd)
def format_usage(self, usage):
msg = IndentedHelpFormatter.format_usage(self, usage)
return '%s\n%s' % (self.banner, msg)
def main():
# Parse the command line arguments.
formatter = BannerHelpFormatter(
"Python script to use the Google search engine\n"
"By Mario Vilas (mvilas at gmail dot com)\n"
"https://github.com/MarioVilas/googlesearch\n"
)
parser = OptionParser(formatter=formatter)
parser.set_usage("%prog [options] query")
parser.add_option(
'--tld', metavar='TLD', type='string', default='com',
help="top level domain to use [default: com]")
parser.add_option(
'--lang', metavar='LANGUAGE', type='string', default='en',
help="produce results in the given language [default: en]")
parser.add_option(
'--domains', metavar='DOMAINS', type='string', default='',
help="comma separated list of domains to constrain the search to")
parser.add_option(
'--tbs', metavar='TBS', type='string', default='0',
help="produce results from period [default: 0]")
parser.add_option(
'--safe', metavar='SAFE', type='string', default='off',
help="kids safe search [default: off]")
parser.add_option(
'--type', metavar='TYPE', type='string', default='search', dest='tpe',
help="search type (search, images, videos, news, shopping, books,"
" apps) [default: search]")
parser.add_option(
'--country', metavar='COUNTRY', type='string', default='',
help="region to restrict search on [default: not restricted]")
parser.add_option(
'--num', metavar='NUMBER', type='int', default=10,
help="number of results per page [default: 10]")
parser.add_option(
'--start', metavar='NUMBER', type='int', default=0,
help="first result to retrieve [default: 0]")
parser.add_option(
'--stop', metavar='NUMBER', type='int', default=0,
help="last result to retrieve [default: unlimited]")
parser.add_option(
'--pause', metavar='SECONDS', type='float', default=2.0,
help="pause between HTTP requests [default: 2.0]")
parser.add_option(
'--rua', metavar='USERAGENT', action='store_true', default=False,
help="Randomize the User-Agent [default: no]")
(options, args) = parser.parse_args()
query = ' '.join(args)
if not query:
parser.print_help()
sys.exit(2)
params = [
(k, v) for (k, v) in options.__dict__.items()
if not k.startswith('_')]
params = dict(params)
# Split the comma separated list of domains, if present.
if 'domains' in params:
params['domains'] = [x.strip() for x in params['domains'].split(',')]
# Use a special search type if requested.
if 'tpe' in params:
tpe = params['tpe']
if tpe and tpe not in (
'search', 'images', 'videos', 'news',
'shopping', 'books', 'apps'):
parser.error("invalid type: %r" % tpe)
if tpe == 'search':
params['tpe'] = ''
# Randomize the user agent if requested.
if 'rua' in params and params.pop('rua'):
params['user_agent'] = get_random_user_agent()
# Run the query.
for url in search(query, **params):
print(url)
try:
sys.stdout.flush()
except Exception:
pass
if __name__ == '__main__':
main()

View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from google_auth_oauthlib.tool.__main__ import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/mako-render Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from mako.cmd import cmdline
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(cmdline())

8
calendarwatch/bin/pip Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/pip-3.7 Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/pip3 Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/pip3.7 Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from rsa.cli import decrypt
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(decrypt())

View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from rsa.cli import encrypt
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(encrypt())

8
calendarwatch/bin/pyrsa-keygen Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from rsa.cli import keygen
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(keygen())

View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from rsa.util import private_to_public
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(private_to_public())

8
calendarwatch/bin/pyrsa-sign Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from rsa.cli import sign
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(sign())

8
calendarwatch/bin/pyrsa-verify Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from rsa.cli import verify
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(verify())

1
calendarwatch/bin/python Symbolic link
View File

@ -0,0 +1 @@
/usr/bin/python3

1
calendarwatch/bin/python3 Symbolic link
View File

@ -0,0 +1 @@
python

1
calendarwatch/bin/python3.7 Symbolic link
View File

@ -0,0 +1 @@
python

BIN
calendarwatch/bin/uwsgi Executable file

Binary file not shown.

8
calendarwatch/bin/wheel Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from wheel.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/wheel-3.7 Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from wheel.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/bin/wheel3 Executable file
View File

@ -0,0 +1,8 @@
#!/home/raphael/dev/git/calendarwatch_frontend/calendarwatch/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from wheel.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
calendarwatch/pyvenv.cfg Normal file
View File

@ -0,0 +1,8 @@
home = /usr
implementation = CPython
version_info = 3.7.3.final.0
virtualenv = 20.0.20
include-system-site-packages = false
base-prefix = /usr
base-exec-prefix = /usr
base-executable = /usr/bin/python3

View File

@ -93,13 +93,6 @@ def verifyResponse():
def get_google_provider_cfg(): def get_google_provider_cfg():
return requests.get(GOOGLE_DISCOVERY_URL).json() return requests.get(GOOGLE_DISCOVERY_URL).json()
def deleteAccount(user):
result = requests.post('https://oauth2.googleapis.com/revoke',
params={'token': user.get('token')},
headers = {'content-type': 'applixation/x-www-form-urlencoded'})
print(result, flush=True)
return
class Calendar: class Calendar:
def __init__(self, name, calendarId, toggle='False', color="#000000"): def __init__(self, name, calendarId, toggle='False', color="#000000"):
self.name = name self.name = name
@ -145,8 +138,6 @@ def updateCalendars():
# a = flask.session['credentials'] # a = flask.session['credentials']
# print(a, flush=True) # print(a, flush=True)
# print(current_user.getGoogleCredentials(), flush=True) # print(current_user.getGoogleCredentials(), flush=True)
if current_user.getGoogleCredentials() == None:
return
credentials = google.oauth2.credentials.Credentials(**current_user.getGoogleCredentials()) credentials = google.oauth2.credentials.Credentials(**current_user.getGoogleCredentials())
calendars = caltojson.getCalendarList(credentials) calendars = caltojson.getCalendarList(credentials)

View File

@ -6,7 +6,7 @@ import sqlite3
# Third-party libraries # Third-party libraries
import flask import flask
from flask import render_template, flash from flask import render_template, flash
from flask import Flask, redirect, request, url_for, jsonify from flask import Flask, redirect, request, url_for
from flask_login import ( from flask_login import (
LoginManager, LoginManager,
current_user, current_user,
@ -18,7 +18,6 @@ import requests
import server.googleHandler as google import server.googleHandler as google
from backend.Routine import Routine
from server import login_manager, app, db from server import login_manager, app, db
from server.forms import LoginForm, RegistrationForm, DeviceForm from server.forms import LoginForm, RegistrationForm, DeviceForm
from server.models import User, Calendar, Device from server.models import User, Calendar, Device
@ -101,25 +100,16 @@ def register():
return redirect(url_for('emaillogin')) return redirect(url_for('emaillogin'))
return flask.render_template('register.html', title='Register', form=form) return flask.render_template('register.html', title='Register', form=form)
@app.route("/delete_account") @app.route("/test")
def deleteAccount(): def testAPI():
if not current_user.is_authenticated: if current_user.is_authenticated:
return redirect(url_for('account')) google.updateCalendars()
print(current_user.getGoogleCredentials(), flush=True) return redirect('/account')
google.deleteAccount(current_user.getGoogleCredentials())
user = db.session.query(User).filter(User.id==current_user.id).first()
logout_user()
db.session.delete(user)
db.session.commit()
return redirect(url_for('account'))
@app.route("/login/google") @app.route("/login/google")
def googlelogin(): def googlelogin():
if current_user.is_authenticated and current_user.getGoogleCredentials() != None:
return redirect(url_for('account'))
authorization_url = google.login() authorization_url = google.login()
return flask.redirect(authorization_url) return flask.redirect(authorization_url)
@ -127,9 +117,6 @@ def googlelogin():
@app.route("/login/google/callback") @app.route("/login/google/callback")
def callback(): def callback():
session, credentials = google.verifyResponse() session, credentials = google.verifyResponse()
if current_user.is_authenticated and current_user.getGoogleCredentials == None:
current_user.setGoogleCredentials(credentials)
userinfo = session.get('https://www.googleapis.com/userinfo/v2/me').json() userinfo = session.get('https://www.googleapis.com/userinfo/v2/me').json()
# Create a user in your db with the information provided # Create a user in your db with the information provided
@ -173,25 +160,11 @@ def credentials_to_dict(credentials):
'scopes': credentials.scopes} 'scopes': credentials.scopes}
@app.route("/userinfo/<path:device>/calendarevents.json") @app.route("/userinfo/<path:user>/calendarevents.json")
def downloader(device): def downloader(user):
path = "/home/calendarwatch/userinfo/" + device + "/" path = "/home/calendarwatch/userinfo/" + user + "/"
# return flask.send_from_directory(path, "calendarevents.json") print(path, flush=True)
request_user = db.session.query(User).filter(User.id==device).first() return flask.send_from_directory(path, "calendarevents.json")
if request_user == None:
return jsonify(kind="unregistered")
routine = Routine()
routine.updateCalendar(request_user)
return jsonify(request_user.getJson())
@app.route("/devicefingerprint.json")
def generateDeviceFingerprint():
# Create Three Random Words
# check not in Device Database
# Save as new Device
# Send to User
return jsonify(deviceId="Carrot-Enamel-Storm")
# POST # POST

Binary file not shown.

View File

@ -227,10 +227,6 @@ body *
color: #333; color: #333;
} }
.grey {
background-color: #ddd;
}
.sub.container .name { .sub.container .name {
margin-right: 1rem; margin-right: 1rem;
} }

View File

@ -31,12 +31,8 @@
</div> </div>
{% endfor %} {% endfor %}
<div id=calendars class="container">
<a class="button" href="login/google">Google Calendar</a>
<a class="button" href="#" >Nextcloud Calendar</a>
</div>
<div class="container"> <div class="container">
<a class="button addcalendar" href="/login/google" style="width: auto; margin: 4rem">Add Calendar</a> <div class="button addcalendar" style="width: auto; margin: 4rem">Add Calendar</div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">

View File

@ -3,33 +3,33 @@
<div class="container"> <div class="container">
<div style="font-weight: bold;width: 15rem; margin: 1rem">Device ID</div> <div style="font-weight: bold;width: 15rem; margin: 1rem">Device ID</div>
<div style="font-weight: bold;width: 10rem; margin: 1rem; padding-right: 4rem">Link Status</div> <div style="font-weight: bold;width: 10rem; margin: 1rem; padding-right: 5rem">Link Status</div>
<div style="font-weight: bold;width: 4rem; margin: 1rem">Action</div> <div style="font-weight: bold;width: 2rem; margin: 1rem">Action</div>
</div> </div>
{% for item in devices %} {% for item in devices %}
<div class="container"> <div class="container">
<!--device id--> <!--Name-->
<div style="width: 15rem; margin: 1rem;">{{ item.deviceId }}</div> <div style="width: 15rem; margin: 1rem;">{{ item.deviceId }}</div>
<!--link status--> <!--Toggle-->
<div style="width: 10rem; margin: 1rem; padding-right: 4rem"> <div style="width: 10rem; margin: 1rem; padding-right: 5rem">
Connected Connected
</div> </div>
<!--action button--> <!--Color Selector-->
<div style="width: 4rem; margin: 1rem;"> <div style="width: 2rem; margin: 1rem;">
<button type="button">Unlink</button> <button type="button">Unlink</button>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
<form action="" method="post"> <form action="" method="post">
<div class="container grey" style="margin-top: 3rem;"> <div class="container">
<div>{{ form.hidden_tag() }}</div> <div style="margin: 2rem">{{ form.hidden_tag() }}</div>
<div style="width: 7rem; margin: 1rem">{{ form.deviceId.label }}</div> <div style="margin: 2rem">{{ form.deviceId.label }}</div>
<div style="width: 12rem; margin: 1rem">{{ form.deviceId(size=24) }}</div> <div style="margin: 2rem">{{ form.deviceId(size=32) }}</div>
<div style="with: 7rem; margin: 1rem">{{ form.submit() }}</div> <div style="margin: 2rem">{{ form.submit() }}</div>
</div> </div>
</form> </form>