예제 #1
0
    def summerize(metadata_arr, date):
        def summerize_task_item(summary, task, metadata_date, key, val):
            if val not in summary[key]:
                summary[key][val] = {
                    "day": 0,
                    "week": 0,
                    "month": 0,
                    "dayTimes": 0,
                }

            if date_helpers.is_same_week(date, metadata_date):
                summary[key][val]["week"] += task["duration"]

            if date_helpers.is_same_day(date, metadata_date):
                summary[key][val]["day"] += task["duration"]
                summary[key][val]["dayTimes"] += 1

            summary[key][val]["month"] += task["duration"]

        summary = {'tags': {}, 'people': {}, 'locations': {}}
        for metadata in metadata_arr:
            if "tasks" not in metadata:
                continue
            metadata_date = date_helpers.parse_date_str(metadata["date"])

            for task in metadata["tasks"]:
                if task["duration"] is None:
                    continue
                for tag in task["tags"]:
                    summerize_task_item(summary, task, metadata_date, 'tags', tag)
                for person in task["people"]:
                    summerize_task_item(summary, task, metadata_date, 'people', person)
                for location in task["locations"]:
                    summerize_task_item(summary, task, metadata_date, 'locations', location)
        return summary
예제 #2
0
파일: hook.py 프로젝트: mb-dev/plan-my-time
def process_user(dropbox_user_id):
    # OAuth token for the user

    user = models.user.find_user_by_dropbox_id(str(dropbox_user_id))
    if not user:
        app.logger.error("User {0} was not found".format(dropbox_user_id))
        return

    cursor = None
    if "hook_cursor" in user:
        cursor = user["hook_cursor"]

    app.logger.info("Processing update for user {0}".format(user["email"]))

    dropbox = DropboxApi()
    results, cursor = dropbox.get_files_in_folder("/journal", user["dropbox_access_token"], cursor)
    for result in results:
        app.logger.info("processing changed file {0}, with name: {1}".format(result["path_lower"], result["name"]))
        response = dropbox.get_file_content(user["dropbox_access_token"], result["path_lower"])
        content = response["content"]
        date_str = result["name"][:-3]
        filename = result["name"]
        try:
            date = date_helpers.parse_date_str(date_str)
        except ValueError:
            continue
    entry_metadata = TasksParser(date_str, content).to_dict()
    models.entries.create_or_update_entry(user["_id"], filename, date, entry_metadata, dict_without(response, "content"))

    app.logger.info("Finished processing update for user {0}".format(user["email"]))
    models.user.save_hook_cursor(user["_id"], cursor)
예제 #3
0
def addEntry():
    line = request.json["line"]
    date_str = request.json["date"]
    is_after_midnight = request.json["is_after_midnight"] == "true"
    date = date_helpers.parse_date_str(date_str)
    perform_update(date_str, date, "add_line", {"line": line, "is_after_midnight": is_after_midnight})
    entries = models.entries.find_for_user(g.user["_id"], {"date": date})
    return jsonify(entries=entries)
예제 #4
0
def getMetadata():
    date_str = request.args.get('date')
    if not date_str:
        return "missing date", 400
    date = date_helpers.parse_date_str(date_str)
    entries = models.entries.find_for_user_and_month(g.user["_id"], date)
    entry_metadata_arr = [entry["metadata"] for entry in entries]
    summary = TasksParser.summerize(entry_metadata_arr, date)
    return jsonify(metadata=entry_metadata_arr, summary=summary)
예제 #5
0
def getMetadata():
    date_str = request.args.get('date')
    if not date_str:
        return "missing date", 400
    date = date_helpers.parse_date_str(date_str)
    entries = models.entries.find_for_user_and_month(g.user["_id"], date)
    entry_metadata_arr = [entry["metadata"] for entry in entries]
    summary = TasksParser.summerize(entry_metadata_arr, date)
    return jsonify(metadata=entry_metadata_arr, summary=summary)
예제 #6
0
def get_goals():
    """ get list of goals """
    date_str = request.args.get('date')
    if not date_str:
        return "missing date", 400
    date = date_helpers.parse_date_str(date_str)
    goals = models.goals.get_goals(g.user["_id"], date)
    if goals:
        goals = goals["metadata"]
    return jsonify(goals=goals)
예제 #7
0
def get_goals():
    """ get list of goals """
    date_str = request.args.get('date')
    if not date_str:
        return "missing date", 400
    date = date_helpers.parse_date_str(date_str)
    goals = models.goals.get_goals(g.user["_id"], date)
    if goals:
        goals = goals["metadata"]
    return jsonify(goals=goals)
예제 #8
0
def pollChanges():
    last_modified = request.args.get('last_modified')
    date_str = request.args.get('date')
    date = date_helpers.parse_date_str(date_str)
    not_modified = 304

    metadata = models.entries.find_for_user_and_date(g.user["_id"], date)
    if metadata["file_metadata"]["last_modified"] <= last_modified:
        return make_response("", not_modified)

    return make_response("", 200)
예제 #9
0
def pollChanges():
    last_modified = request.args.get('last_modified')
    date_str = request.args.get('date')
    date = date_helpers.parse_date_str(date_str)
    not_modified = 304

    metadata = models.entries.find_for_user_and_date(g.user["_id"], date)
    if metadata["file_metadata"]["last_modified"] <= last_modified:
        return make_response("", not_modified)

    return make_response("", 200)
예제 #10
0
def addEntry():
    line = request.json['line']
    date_str = request.json['date']
    is_after_midnight = request.json['is_after_midnight'] == 'true'
    date = date_helpers.parse_date_str(date_str)
    perform_update(date_str, date, 'add_line', {
        "line": line,
        "is_after_midnight": is_after_midnight
    })
    entries = models.entries.find_for_user(g.user["_id"], {"date": date})
    return jsonify(entries=entries)
예제 #11
0
def update_goals():
    """ updates the goals file """
    start_date_str = request.json['start_date']
    end_date_str = request.json['end_date']
    start_date = date_helpers.parse_date_str(start_date_str)
    end_date = date_helpers.parse_date_str(end_date_str)

    content = request.form['content']

    # update Dropbox
    dropbox = DropboxApi()
    filename = start_date_str + "-" + end_date_str + ".md"
    file_metadata = dropbox.update_file(g.user["dropbox_access_token"], "/goals/" + filename, content)

    # update metadata
    goal_metadata = []
    if len(content) > 0:
        goal_metadata = GoalsParser(content).to_array()
        models.goals.create_or_update_entry(g.user["_id"], start_date, end_date, goal_metadata, file_metadata)
        return jsonify({"success": True, **file_metadata})
예제 #12
0
def getEntries():
    query = {}
    tag = request.args.get("tag")
    date_str = request.args.get("date")
    if tag:
        query["tag"] = tag
    if date_str:
        date = date_helpers.parse_date_str(date_str)
        query["date"] = date
    if len(query) == 0:
        return "missing query parameters", 400
    entries = models.entries.find_for_user(g.user["_id"], query)
    return jsonify(entries=entries)
예제 #13
0
def getEntries():
    query = {}
    tag = request.args.get('tag')
    date_str = request.args.get('date')
    if tag:
        query["tag"] = tag
    if date_str:
        date = date_helpers.parse_date_str(date_str)
        query["date"] = date
    if len(query) == 0:
        return "missing query parameters", 400
    entries = models.entries.find_for_user(g.user["_id"], query)
    return jsonify(entries=entries)
예제 #14
0
def editEntry():
    prev_line = request.json['prev_line']
    new_line = request.json['new_line']
    date_str = request.json['date']
    is_after_midnight = request.json['is_after_midnight'] == 'true'
    date = date_helpers.parse_date_str(date_str)
    perform_update(
        date_str, date, 'edit_line', {
            "prev_line": prev_line,
            "new_line": new_line,
            "is_after_midnight": is_after_midnight,
        })
    entries = models.entries.find_for_user(g.user["_id"], {"date": date})
    return jsonify(entries=entries)
예제 #15
0
def getTags():
    date_str = request.args.get('date')
    tags = []
    if date_str is not None:
        date = date_helpers.parse_date_str(date_str)
        entry = models.entries.find_one_for_user_and_date(g.user["_id"], date)
        if entry is not None:
            summary = TasksParser.summerize([entry['metadata']], date)
            tags.extend([{"type": "tag", "tag": tag} for tag in summary["tags"]])
            tags.extend([{"type": "person", "tag": tag} for tag in summary["people"]])
            tags.extend([{"type": "location", "tag": tag} for tag in summary["locations"]])
    else:
        tags = models.tags.get_all_tags(g.user["_id"])
    return jsonify(tags=tags)
예제 #16
0
def editEntry():
    prev_line = request.json["prev_line"]
    new_line = request.json["new_line"]
    date_str = request.json["date"]
    is_after_midnight = request.json["is_after_midnight"] == "true"
    date = date_helpers.parse_date_str(date_str)
    perform_update(
        date_str,
        date,
        "edit_line",
        {"prev_line": prev_line, "new_line": new_line, "is_after_midnight": is_after_midnight},
    )
    entries = models.entries.find_for_user(g.user["_id"], {"date": date})
    return jsonify(entries=entries)
예제 #17
0
def update_goals():
    """ updates the goals file """
    start_date_str = request.json['start_date']
    end_date_str = request.json['end_date']
    start_date = date_helpers.parse_date_str(start_date_str)
    end_date = date_helpers.parse_date_str(end_date_str)

    content = request.form['content']

    # update Dropbox
    dropbox = DropboxApi()
    filename = start_date_str + "-" + end_date_str + ".md"
    file_metadata = dropbox.update_file(g.user["dropbox_access_token"],
                                        "/goals/" + filename, content)

    # update metadata
    goal_metadata = []
    if len(content) > 0:
        goal_metadata = GoalsParser(content).to_array()
        models.goals.create_or_update_entry(g.user["_id"], start_date,
                                            end_date, goal_metadata,
                                            file_metadata)
        return jsonify({"success": True, **file_metadata})
예제 #18
0
def updateJournal():
    date_str = request.json['date']
    content = request.json['text']

    # update dropbox
    dropbox = DropboxApi()
    filename = date_str + ".md"
    file_metadata = dropbox.update_file(g.user["dropbox_access_token"], "/journal/" + filename, content)

    # update metadata
    date = date_helpers.parse_date_str(date_str)
    entry_metadata = {}
    if len(content) > 0:
        entry_metadata = TasksParser(date_str, content).to_dict()
        models.entries.create_or_update_entry(g.user["_id"], filename, date, entry_metadata, file_metadata)
        return jsonify({"success": True, **file_metadata})
예제 #19
0
def updateJournal():
    date_str = request.json['date']
    content = request.json['text']

    # update dropbox
    dropbox = DropboxApi()
    filename = date_str + ".md"
    file_metadata = dropbox.update_file(g.user["dropbox_access_token"],
                                        "/journal/" + filename, content)

    # update metadata
    date = date_helpers.parse_date_str(date_str)
    entry_metadata = {}
    if len(content) > 0:
        entry_metadata = TasksParser(date_str, content).to_dict()
        models.entries.create_or_update_entry(g.user["_id"], filename, date,
                                              entry_metadata, file_metadata)
        return jsonify({"success": True, **file_metadata})
예제 #20
0
def process_user(dropbox_user_id):
    # OAuth token for the user

    user = models.user.find_user_by_dropbox_id(str(dropbox_user_id))
    if not user:
        app.logger.error("User {0} was not found".format(dropbox_user_id))
        return

    cursor = None
    if "hook_cursor" in user:
        cursor = user["hook_cursor"]

    app.logger.info("Processing update for user {0}".format(user["email"]))

    dropbox = DropboxApi()
    results, cursor = dropbox.get_files_in_folder("/journal",
                                                  user["dropbox_access_token"],
                                                  cursor)
    for result in results:
        app.logger.info("processing changed file {0}, with name: {1}".format(
            result["path_lower"], result["name"]))
        response = dropbox.get_file_content(user["dropbox_access_token"],
                                            result["path_lower"])
        content = response["content"]
        date_str = result["name"][:-3]
        filename = result["name"]
        try:
            date = date_helpers.parse_date_str(date_str)
        except ValueError:
            continue
    entry_metadata = TasksParser(date_str, content).to_dict()
    models.entries.create_or_update_entry(user["_id"], filename, date,
                                          entry_metadata,
                                          dict_without(response, "content"))

    app.logger.info("Finished processing update for user {0}".format(
        user["email"]))
    models.user.save_hook_cursor(user["_id"], cursor)
예제 #21
0
def getTags():
    date_str = request.args.get('date')
    tags = []
    if date_str is not None:
        date = date_helpers.parse_date_str(date_str)
        entry = models.entries.find_one_for_user_and_date(g.user["_id"], date)
        if entry is not None:
            summary = TasksParser.summerize([entry['metadata']], date)
            tags.extend([{
                "type": "tag",
                "tag": tag
            } for tag in summary["tags"]])
            tags.extend([{
                "type": "person",
                "tag": tag
            } for tag in summary["people"]])
            tags.extend([{
                "type": "location",
                "tag": tag
            } for tag in summary["locations"]])
    else:
        tags = models.tags.get_all_tags(g.user["_id"])
    return jsonify(tags=tags)
예제 #22
0
import models.user

def dict_without(d, key):
    new_d = d.copy()
    new_d.pop(key)
    return new_d

dropbox = DropboxApi()
for user in mongo.db.users.find():
    if user["dropbox_access_token"] == "fakeId":
        continue

    app.logger.info("Processing update for user {0}".format(user["email"]))

    mongo.db.entries.delete_many({})
    results, cursor = dropbox.get_files_in_folder("/journal/", user["dropbox_access_token"])
    for result in results:
        app.logger.info("processing file {0}, with name: {1}".format(result["path_lower"], result["name"]))
        response = dropbox.get_file_content(user["dropbox_access_token"], result["path_lower"])
        content = response["content"]
        date_str = result["name"][:-3]
        filename = result["name"]
        try:
            date = date_helpers.parse_date_str(date_str)
        except ValueError as e:
            continue
        entry_metadata = TasksParser(date_str, content).to_dict()
        models.entries.create_or_update_entry(user["_id"], filename, date, entry_metadata, dict_without(response, "content"))

    app.logger.info("Finished processing update for user {0}".format(user["email"]))