Skip to content

Ranking Compare App

flask_app.app_ranking_compare.loader_user(_user_id)

Load a user from the database based on the given user ID.

Parameters:

Name Type Description Default
_user_id str

The ID of the user to load.

required

Returns:

Name Type Description
User

The loaded user object.

Source code in flask_app/app_ranking_compare.py
62
63
64
65
66
67
68
69
70
71
72
73
74
75
@login_manager.user_loader
def loader_user(_user_id):
    """
    Load a user from the database based on the given user ID.

    Args:
        _user_id (str): The ID of the user to load.

    Returns:
        User: The loaded user object.

    """
    user = database.User.objects(_user_id=_user_id).first()
    return user

flask_app.app_ranking_compare.start_compare(experiment_id)

Redirects to the next task URL for the given experiment ID.

Args:: experiment_id (int): The ID of the experiment.

Returns:

Name Type Description
response Response

The redirect response with the next task URL.

Source code in flask_app/app_ranking_compare.py
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
@app.route("/")
@app.route("/start_compare/<int:experiment_id>", methods=['GET', 'POST'])
def start_compare(experiment_id):
    """
    Redirects to the next task URL for the given experiment ID.

    Args::
        experiment_id (int): The ID of the experiment.

    Returns:
        response (flask.Response): The redirect response with the next task URL.
    """
    url = str(experiment_id) + '/index_compare/' + str(0)
    response = make_response(redirect(url, code=200))
    response.headers['HX-Redirect'] = url
    return response

flask_app.app_ranking_compare.get_task(experiment_id, direction, task_n)

Retrieves the next or previous task based on the given experiment ID, direction, and task number.

Parameters:

Name Type Description Default
experiment_id str

The ID of the experiment.

required
direction str

The direction to navigate the tasks. Can be either 'next' or 'previous'.

required
task_n int

The current task number.

required

Returns:

Name Type Description
dict

A JSON response containing the next task number.

Source code in flask_app/app_ranking_compare.py
 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
@app.route('/api/<experiment_id>/get_task/<direction>/<task_n>', methods=['GET'])
def get_task(experiment_id, direction, task_n):
    """
    Retrieves the next or previous task based on the given experiment ID, direction, and task number.

    Args:
        experiment_id (str): The ID of the experiment.
        direction (str): The direction to navigate the tasks. Can be either 'next' or 'previous'.
        task_n (int): The current task number.

    Returns:
        dict: A JSON response containing the next task number.

    """
    experiment = database.Experiment.objects(_exp_id=str(experiment_id)).first()
    if direction == 'next':
        next_task = int(task_n) + 1
    else:
        next_task = int(task_n) - 1

    if next_task >= len(experiment.tasks):
        next_task = 0
    elif next_task == -1:
        next_task = len(experiment.tasks) - 1
    return jsonify({'next_task': str(next_task)})

flask_app.app_ranking_compare.index_compare(experiment_id, n_task)

Renders Ranking Comparison UI for researchers.

Parameters:

Name Type Description Default
experiment_id str

The ID of the experiment.

required
n_task int

The index of the task.

required

Returns:

Name Type Description
render_template

The rendered HTML template for the index_ranking_compare_template.

Source code in flask_app/app_ranking_compare.py
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
@app.route("/start_compare/<experiment_id>/index_compare/<n_task>", methods=['GET', 'POST'])
def index_compare(experiment_id, n_task):
    """Renders Ranking Comparison UI for researchers.

    Args:
        experiment_id (str): The ID of the experiment.
        n_task (int): The index of the task.

    Returns:
        render_template: The rendered HTML template for the index_ranking_compare_template.

    """
    try:
        exp_obj = database.Experiment.objects(_exp_id=str(experiment_id)).first()
        task_id = exp_obj.tasks[int(n_task)]

        task_obj = database.TaskCompare.objects(_id=task_id).first()
        data_obj = database.Data.objects(_id=task_obj.data).first()
        query_obj = database.QueryRepr.objects(_id=data_obj.query).first()
    except:
        response = make_response(redirect(f"/404/Experiment type is not for app_compare!", code=200))
        response.headers['HX-Redirect'] = f"/404/Experiment type is not for app_compare!"
        return response

    try:
        docs = [ranking for ranking in data_obj.rankings if ranking.ranking_type == task_obj.ranking_type_1][0].docs
    except:
        response = make_response(redirect(f"/404/No document with the ranking type!", code=200))
        response.headers['HX-Redirect'] = f"/404/No document with the ranking type!"
        return response

    docs_obj_1 = [database.DocRepr.objects(_id=doc_id).first() for doc_id in docs]

    try:
        docs = [ranking for ranking in data_obj.rankings if ranking.ranking_type == task_obj.ranking_type_2][0].docs
    except:
        response = make_response(redirect(f"/404/No document with the ranking type!", code=200))
        response.headers['HX-Redirect'] = f"/404/No document with the ranking type!"
        return response

    docs_obj_2 = [database.DocRepr.objects(_id=doc_id).first() for doc_id in docs]

    doc_field_names_display = configs["ui_display_config"]["display_fields"]

    query_title = query_obj.title
    query_text = query_obj.text

    current_url = '/start_compare/' + str(experiment_id) + '/index_compare/' + str(n_task) + '/'
    view_configs = configs["ui_display_config"]

    interactions = get_average_interactions(configs["ui_display_config"]["avg_interaction"]["experiment_id"],
                                            interaction=configs["ui_display_config"]["avg_interaction"]["interaction"])

    fairness_metrics = dict()
    utility_metrics = dict()
    if "display_metrics" in configs["ui_display_config"]:
        utility_metrics[task_obj.ranking_type_1] = get_utility_metrics(configs, docs_obj_1)
        utility_metrics[task_obj.ranking_type_2] = get_utility_metrics(configs, docs_obj_2)
        fairness_metrics[task_obj.ranking_type_1] = get_fairness_metrics(configs, docs_obj_1)
        fairness_metrics[task_obj.ranking_type_2] = get_fairness_metrics(configs, docs_obj_2)
    else:
        utility_metrics[task_obj.ranking_type_1] = []
        utility_metrics[task_obj.ranking_type_2] = []
        fairness_metrics[task_obj.ranking_type_1] = []
        fairness_metrics[task_obj.ranking_type_2] = []

    return render_template('index_ranking_compare_template.html', doc_field_names=doc_field_names_display,
                           avg_interaction=interactions, utility_metrics=utility_metrics,
                           fairness_metrics=fairness_metrics,
                           view_configs=view_configs,
                           doc_data_objects_1=docs_obj_1, doc_data_objects_2=docs_obj_2,
                           ranking_type_1=task_obj.ranking_type_1, ranking_type_2=task_obj.ranking_type_2,
                           query_title=query_title, query_text=query_text, current_url=current_url,
                           task_description=configs["ui_display_config"]["task_description"])