Ejemplo n.º 1
0
def add_indicator(data, result_id, commit=True):
    i = models.ActivityResultIndicator()
    i.indicator_title = data.get('indicator_title')
    i.indicator_description = data.get('indicator_description')
    if data.get("baseline_year"):
        i.baseline_year = isostring_year(data.get('baseline_year'))
    i.baseline_value = data.get('baseline_value')
    i.baseline_description = data.get('baseline_description')
    i.measurement_type = data.get('measurement_type')
    i.measurement_unit_type = data.get('measurement_unit_type')
    i.result_id = result_id
    db.session.add(i)
    db.session.commit()
    if data.get("periods"):
        [
            add_indicator_period(period, i.id, False)
            for period in data['periods']
        ]
    activity_updated(
        i.result.activity_id, {
            "user_id": current_user.id,
            "mode": "add",
            "target": "ActivityResultIndicator",
            "target_id": i.id,
            "old_value": None,
            "value": i.as_dict()
        })
    return i
Ejemplo n.º 2
0
def update_attr(data):
    finance = models.ActivityFinances.query.filter_by(
        id=data['finances_id']
    ).first()

    old_value = getattr(finance, data['attr'])

    if data['attr'].endswith('date'):
        if data["value"] == "":
            data["value"] = None
        else:
            data['value'] = isostring_date(data['value'])
    elif data['attr'] == "transaction_value":
        if data['value'] == "":
            data['value'] = 0.0
    setattr(finance, data['attr'], data['value'])
    db.session.add(finance)
    db.session.commit()

    activity_updated(finance.activity_id,
                     {
                         "user_id": current_user.id,
                         "mode": "update",
                         "target": "ActivityFinances",
                         "target_id": finance.id,
                         "old_value": {data['attr']: old_value},
                         "value": {data['attr']: data['value']}
                     }
                     )

    return finance
Ejemplo n.º 3
0
def update_activity_policy_marker(activity_id, policy_marker_code, data):
    activity_policy_marker = models.ActivityPolicyMarker.query.filter_by(
        activity_id=activity_id,
        policy_marker_code=policy_marker_code).first()
    if activity_policy_marker:
        old_value = getattr(activity_policy_marker, data['attr'])
        mode = "update"
    else:
        activity_policy_marker = models.ActivityPolicyMarker()
        activity_policy_marker.activity_id = activity_id
        activity_policy_marker.policy_marker_code = policy_marker_code
        old_value = {}
        mode = "add"
    setattr(activity_policy_marker, data['attr'], data['value'])
    db.session.add(activity_policy_marker)
    db.session.commit()
    activity_updated(
        activity_id, {
            "user_id": current_user.id,
            "mode": mode,
            "target": "ActivityPolicyMarker",
            "target_id": activity_policy_marker.id,
            "old_value": old_value,
            "value": {
                data['attr']: data['value']
            }
        })
    return True
Ejemplo n.º 4
0
def add_finances(activity_id, data):
    activity_finance = models.ActivityFinances()
    activity_finance.activity_id = activity_id
    classifications = data.get("classifications")
    data.pop("classifications")
    data["transaction_date"] = isostring_date(data["transaction_date"])
    activity_finance.currency_automatic = True
    activity_finance.currency_source, activity_finance.currency_rate, activity_finance.currency_value_date = qexchangerates.get_exchange_rate(
        data["transaction_date"], data.get("currency", "USD"))
    for key, value in data.items():
        setattr(activity_finance, key, value)
    _classifications = []
    for key, value in classifications.items():
        _c = models.ActivityFinancesCodelistCode()
        _c.codelist_id = key
        _c.codelist_code_id = value
        _classifications.append(_c)
    activity_finance.classifications = _classifications
    db.session.add(activity_finance)
    db.session.commit()

    activity_updated(activity_id,
         {
             "user_id": current_user.id,
             "mode": "add",
             "target": "ActivityFinances",
             "target_id": activity_finance.id,
             "old_value": None,
             "value": activity_finance.as_dict()
         }
     )
    return activity_finance
Ejemplo n.º 5
0
def update_attr(data):
    if data['attr'] in ["mtef-sector", "aligned-ministry-agency", "sdg-goals"]:
        # Delete existing database entry
        old_clc = models.ActivityCodelistCode.query.filter(
            models.ActivityCodelistCode.activity_id == data['id'],
            models.CodelistCode.codelist_code == data['attr']).join(
                models.CodelistCode).all()
        for code in old_clc:
            db.session.delete(code)
        new_clc = models.ActivityCodelistCode()
        new_clc.activity_id = data["id"]
        new_clc.codelist_code_id = data['value']
        db.session.add(new_clc)
        db.session.commit()
        return True

    activity = models.Activity.query.filter_by(id=data['id']).first()

    if data['attr'].endswith('date'):
        data['value'] = isostring_date(data['value'])
        if data['attr'] == "start_date":
            if data['value'].date() < activity.start_date:
                new_fs = qfinances.create_missing_forward_spends(
                    data['value'].date(), activity.end_date, activity.id)
                activity.forwardspends += new_fs
                print("Warning: activity start date moved earlier")
            if data['value'].date() > activity.start_date:
                # FIXME: need to remove 0-valued forward spend periods
                print("Warning: activity start date moved later")
        if data['attr'] == "end_date":
            if data['value'].date() > activity.end_date:
                new_fs = qfinances.create_missing_forward_spends(
                    activity.start_date, data['value'].date(), activity.id)
                activity.forwardspends += new_fs
                print("Warning: activity end date moved later")
            if data['value'].date() < activity.end_date:
                # FIXME: need to remove 0-valued forward spend periods
                print("Warning: activity end date moved earlier")

    if (data['attr'].startswith("total_") and data['value'] == ""):
        data['value'] = 0
    old_value = getattr(activity, data['attr'])
    setattr(activity, data['attr'], data['value'])
    activity.updated_date = datetime.datetime.utcnow()
    db.session.add(activity)
    db.session.commit()
    activity_updated(
        activity.id, {
            "user_id": current_user.id,
            "mode": "update",
            "target": "Activity",
            "target_id": activity.id,
            "old_value": {
                data['attr']: old_value
            },
            "value": {
                data['attr']: data['value']
            }
        })
    return True
Ejemplo n.º 6
0
def create_activity(data):
    # FIXME check this org doesn't already exist?
    act = models.Activity()

    # Dates have to be converted to date format
    data["start_date"] = isostring_date(data["start_date"])
    data["end_date"] = isostring_date(data["end_date"])

    classifications = []
    for cl in [
            "sdg-goals", "mtef-sector", "aft-pillar",
            "aligned-ministry-agency", "papd-pillar"
    ]:
        cl_id = 'classification_id_{}'.format(cl)
        cl_pct = 'classification_percentage_{}'.format(cl)
        classification = models.ActivityCodelistCode()
        classification.codelist_code_id = data[cl_id]
        classifications.append(classification)
        data.pop(cl_id)
        data.pop(cl_pct)
    act.classifications = classifications

    orgs = []
    for org_id, org_role in ((data["org_4"], 4), (data["org_1"], 1)):
        org = models.ActivityOrganisation()
        org.organisation_id = org_id
        org.role = org_role
        data.pop("org_{}".format(org_role))
        orgs.append(org)
    act.organisations = orgs

    for attr, val in data.items():
        if attr.startswith("total_"):
            if val == "":
                val = 0
        setattr(act, attr, val)
    if not "forwardspends" in data:
        act.forwardspends = qfinances.create_forward_spends(
            data["start_date"], data["end_date"])
    db.session.add(act)
    db.session.commit()

    activity_updated(
        act.id, {
            "user_id": current_user.id,
            "mode": "add",
            "target": "Activity",
            "target_id": act.id,
            "old_value": None,
            "value": act.as_dict()
        })
    return act
Ejemplo n.º 7
0
def update_result_attr(data):
    result = models.ActivityResult.query.filter_by(id=data['id']).first()
    oldresult = result.as_dict()
    setattr(result, data['attr'], data['value'])
    db.session.add(result)
    db.session.commit()
    activity_updated(
        result.activity_id, {
            "user_id": current_user.id,
            "mode": "update",
            "target": "ActivityResult",
            "target_id": result.id,
            "old_value": oldresult,
            "value": result.as_dict()
        })
    return result
Ejemplo n.º 8
0
def create_or_update_forwardspend(activity_id, quarter, year, value, currency):
    # NB quarters are in calendar quarters, not Liberian fiscal quarters
    start_day, start_month = QUARTERS_MONTH_DAY[quarter]["start"]
    end_day, end_month = QUARTERS_MONTH_DAY[quarter]["end"]
    start_date = datetime.datetime(year, start_month, start_day).date()
    end_date = datetime.datetime(year, end_month, end_day).date()
    forward_spend = models.ActivityForwardSpend.query.filter_by(activity_id=activity_id,
                                                     period_start_date=start_date).first()
    if forward_spend:
        old_value = forward_spend.value
        forward_spend.value = value
        db.session.add(forward_spend)
        db.session.commit()
        activity_updated(forward_spend.activity_id,
            {
                "user_id": current_user.id,
                "mode": "update",
                "target": "ActivityForwardSpend",
                "target_id": forward_spend.id,
                "old_value": {"value": old_value},
                "value": {"value": value}
            }
        )
        return forward_spend
    else:
        forward_spend = models.ActivityForwardSpend()
        forward_spend.activity_id = activity_id
        forward_spend.value = value
        forward_spend.value_date = start_date
        forward_spend.value_currency = currency
        forward_spend.period_start_date = start_date
        forward_spend.period_end_date = end_date
        db.session.add(forward_spend)
        db.session.commit()
        activity_updated(forward_spend.activity_id,
            {
                "user_id": current_user.id,
                "mode": "add",
                "target": "ActivityForwardSpend",
                "target_id": forward_spend.id,
                "old_value": None,
                "value": forward_spend.as_dict()
            }
        )
        return forward_spend
Ejemplo n.º 9
0
def delete_activity(activity_id):
    activity = models.Activity.query.filter_by(id=activity_id).first()
    if ((getattr(current_user, "id") == activity.user_id)
            or (getattr(current_user, "administrator"))):
        # Allow this activity to be deleted
        db.session.delete(activity)
        db.session.commit()
        return True
    activity_updated(
        activity.id, {
            "user_id": current_user.id,
            "mode": "delete",
            "target": "Activity",
            "target_id": activity.id,
            "old_value": activity.as_dict(),
            "value": None
        })
    return False
Ejemplo n.º 10
0
def update_indicator_attr(data):
    indicator = models.ActivityResultIndicator.query.filter_by(
        id=data['id']).first()
    oldindicator = indicator.as_dict()
    if (data['attr'].endswith("year")) and not (data['value'] in (None, '')):
        data['value'] = isostring_year(str(data['value']))
    setattr(indicator, data['attr'], data['value'])
    db.session.add(indicator)
    db.session.commit()
    activity_updated(
        indicator.result.activity_id, {
            "user_id": current_user.id,
            "mode": "update",
            "target": "ActivityResultIndicator",
            "target_id": indicator.id,
            "old_value": oldindicator,
            "value": indicator.as_dict()
        })
    return indicator
Ejemplo n.º 11
0
def update_fs_attr(data):
    forward_spend = models.ActivityForwardSpend.query.filter_by(
        id=data['id']
    ).first()
    old_value = forward_spend.value
    forward_spend.value = data['value']
    db.session.add(forward_spend)
    db.session.commit()

    activity_updated(forward_spend.activity_id,
        {
            "user_id": current_user.id,
            "mode": "update",
            "target": "ActivityForwardSpend",
            "target_id": forward_spend.id,
            "old_value": {"value": old_value},
            "value": {"value": data['value']}
        }
    )
    return True
Ejemplo n.º 12
0
def update_indicator_period_attr(data):
    period = models.ActivityResultIndicatorPeriod.query.filter_by(
        id=data['id']).first()
    oldperiod = period.as_dict()
    if data['attr'].startswith("period_"):
        data['value'] = isostring_date(data['value'])
    if hasattr(period, data['attr']):
        setattr(period, data['attr'], data['value'])
    db.session.add(period)
    db.session.commit()
    activity_updated(
        period.result_indicator.result.activity_id, {
            "user_id": current_user.id,
            "mode": "update",
            "target": "ActivityResultIndicatorPeriod",
            "target_id": period.id,
            "old_value": oldperiod,
            "value": period.as_dict()
        })
    return period
Ejemplo n.º 13
0
def delete_location(activity_id, location_id):
    check_location = models.ActivityLocation.query.filter_by(
        activity_id=activity_id,
        location_id=location_id
    ).first()
    if check_location:
        db.session.delete(check_location)
        db.session.commit()

        activity_updated(activity_id,
                         {
                             "user_id": current_user.id,
                             "mode": "delete",
                             "target": "ActivityLocation",
                             "target_id": check_location.id,
                             "old_value": {'location_id': location_id},
                             "value": None
                         }
                         )
        return True
    return False
Ejemplo n.º 14
0
def add_indicator_period(data, indicator_id, commit=True):
    p = models.ActivityResultIndicatorPeriod()
    p.period_start = isostring_date(data.get("period_start"))
    p.period_end = isostring_date(data.get("period_end"))
    p.target_value = data.get("target_value")
    p.target_comment = data.get("target_comment")
    p.actual_value = data.get("actual_value")
    p.actual_comment = data.get("actual_comment")
    p.indicator_id = indicator_id
    db.session.add(p)
    db.session.commit()
    activity_updated(
        p.result_indicator.result.activity_id, {
            "user_id": current_user.id,
            "mode": "add",
            "target": "ActivityResultIndicatorPeriod",
            "target_id": p.id,
            "old_value": None,
            "value": p.as_dict()
        })
    return p
Ejemplo n.º 15
0
def update_finances_classification(data):
    check_finance = models.ActivityFinancesCodelistCode.query.filter_by(
        activityfinance_id=data["finances_id"],
        codelist_id=data["attr"]
    ).first()
    if not check_finance:
        return False
    old_value = check_finance.codelist_code_id
    check_finance.codelist_code_id = data["value"]
    db.session.add(check_finance)
    db.session.commit()

    activity_updated(data["activity_id"],
                     {
        "user_id": current_user.id,
        "mode": "update",
        "target": "ActivityFinancesCodelistCode",
        "target_id": check_finance.id,
        "old_value": {data["attr"]: old_value},
        "value": {data["attr"]: data["value"]}
    }
    )
    return models.ActivityFinances.query.filter_by(id=data["finances_id"]).first()
Ejemplo n.º 16
0
def delete_finances(activity_id, finances_id):
    print("Delete activity id {} finances id {}".format(activity_id, finances_id))
    check_finance = models.ActivityFinances.query.filter_by(
        activity_id=activity_id,
        id=finances_id
    ).first()
    if check_finance:
        old_value = check_finance.as_dict()
        db.session.delete(check_finance)
        db.session.commit()

        activity_updated(check_finance.activity_id,
            {
                "user_id": current_user.id,
                "mode": "delete",
                "target": "ActivityFinances",
                "target_id": old_value["id"],
                "old_value": old_value,
                "value": None
            }
        )
        return {"result": True}
    return False
Ejemplo n.º 17
0
def update_activity_codelist(activitycodelistcode_id, data):
    activity_codelist = models.ActivityCodelistCode.query.filter_by(
        id=activitycodelistcode_id).first()
    if not activity_codelist:
        return False
    old_value = getattr(activity_codelist, data['attr'])
    setattr(activity_codelist, data['attr'], data['value'])
    db.session.add(activity_codelist)
    db.session.commit()
    activity_updated(
        activity_codelist.activity_id, {
            "user_id": current_user.id,
            "mode": "update",
            "target": "ActivityCodelistCode",
            "target_id": activity_codelist.id,
            "old_value": {
                data['attr']: old_value
            },
            "value": {
                data['attr']: data['value']
            }
        })
    return True
Ejemplo n.º 18
0
def make_updated_info(updated, activity, num_updated_activities):
    if (updated.get("mtef_years") or updated.get("counterpart_years") or
        updated.get("disbursements") or updated.get("activity")):
        num_updated_activities += 1
        activity_updated(activity.id)
    else:
        return None, num_updated_activities
    msg = "Updated {} (Project ID: {}): ".format(
        activity.title,
        activity.id)
    msgs = []
    if updated.get("activity"):
        msgs.append("updated activity data")
    if updated.get("mtef_years"):
        msgs.append("updated MTEF projections for {}".format(
            ", ".join(updated["mtef_years"])))
    if updated.get("counterpart_years"):
        msgs.append("updated counterpart funding for {}".format(
            ", ".join(updated["counterpart_years"])))
    if updated.get("disbursements"):
        msgs.append("updated disbursement data for {}".format(
            ", ".join(updated["disbursements"])))
    return msg + "; ".join(msgs), num_updated_activities
Ejemplo n.º 19
0
def add_result(data, activity_id, organisation_slug=None, commit=True):
    r = models.ActivityResult()
    r.result_title = data.get('result_title')
    r.result_description = data.get('result_description')
    r.result_type = data.get('result_type')
    r.activity_id = activity_id
    db.session.add(r)
    db.session.commit()
    if data.get("indicators"):
        [
            add_indicator(indicator, r.id, False)
            for indicator in data['indicators']
        ]
    activity_updated(
        activity_id, {
            "user_id": current_user.id,
            "mode": "add",
            "target": "ActivityResult",
            "target_id": r.id,
            "old_value": None,
            "value": r.as_dict()
        })
    return r
Ejemplo n.º 20
0
def delete_result_data(data):
    if data['result_type'] == "ActivityResult":
        r = models.ActivityResult.query.filter_by(id=data['id']).first()
        activity_id = r.activity_id
    elif data['result_type'] == "ActivityResultIndicator":
        r = models.ActivityResultIndicator.query.filter_by(
            id=data['id']).first()
        activity_id = r.result.activity_id
    elif data['result_type'] == "ActivityResultIndicatorPeriod":
        r = models.ActivityResultIndicatorPeriod.query.filter_by(
            id=data['id']).first()
        activity_id = r.result_indicator.result.activity_id

    activity_updated(
        activity_id, {
            "user_id": current_user.id,
            "mode": "delete",
            "target": data["result_type"],
            "target_id": r.id,
            "old_value": r.as_dict(),
            "value": None
        })
    db.session.delete(r)
    db.session.commit()
Ejemplo n.º 21
0
def add_location(activity_id, location_id):
    check_location = models.ActivityLocation.query.filter_by(
        activity_id=activity_id,
        location_id=location_id
    ).first()
    if not check_location:
        activity_location = models.ActivityLocation()
        activity_location.activity_id = activity_id
        activity_location.location_id = location_id
        db.session.add(activity_location)
        db.session.commit()

        activity_updated(activity_id,
                         {
                             "user_id": current_user.id,
                             "mode": "add",
                             "target": "ActivityLocation",
                             "target_id": activity_location.id,
                             "old_value": None,
                             "value": {'location_id': location_id}
                         }
                         )
        return True
    return False