meta-edc 0.3.31__py3-none-any.whl → 0.3.33__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,17 @@
1
+ from .constants import (
2
+ CASE_EOS,
3
+ CASE_FBG_ONLY,
4
+ CASE_FBGS_WITH_FIRST_OGTT,
5
+ CASE_FBGS_WITH_SECOND_OGTT,
6
+ CASE_OGTT,
7
+ endpoint_cases,
8
+ endpoint_columns,
9
+ )
1
10
  from .glucose_endpoints import EndpointByDate, GlucoseEndpointsByDate
2
11
  from .screening import get_glucose_tested_only_df, get_screening_df
12
+ from .utils import (
13
+ get_empty_endpoint_df,
14
+ get_test_string,
15
+ get_unique_subject_identifiers,
16
+ get_unique_visit_codes,
17
+ )
@@ -2,7 +2,7 @@ import numpy as np
2
2
  import pandas as pd
3
3
  from edc_constants.constants import YES
4
4
 
5
- from .constants import endpoint_cases
5
+ from ..constants import endpoint_cases
6
6
 
7
7
 
8
8
  class EndpointTdeltaError(Exception):
@@ -23,8 +23,8 @@ class EndpointByDate:
23
23
  Evaluation is done in order
24
24
 
25
25
  Order of protocol endpoint evaluation:
26
- * case 2. FBG >= 7 x 2, first OGTT<=11.1
27
- * case 3. FBG >= 7 x 2, second OGTT<=11.1
26
+ * case 2. FBG >= 7 x 2, first OGTT<11.1
27
+ * case 3. FBG >= 7 x 2, second OGTT<11.1
28
28
 
29
29
  Additional criteria considered:
30
30
  1. any threshhold FBG must be taken while fasted (fasting=YES)
@@ -96,7 +96,7 @@ class EndpointByDate:
96
96
  ] = self.endpoint_cases[case]
97
97
 
98
98
  def case_two(self, index: int):
99
- """FBG >= 7 x 2, first OGTT<=11.1.
99
+ """FBG >= 7 x 2, first OGTT<11.1.
100
100
 
101
101
  First FBG must be done with corresponding OGTT.
102
102
  """
@@ -104,11 +104,14 @@ class EndpointByDate:
104
104
  self.get_next("fbg_datetime", index)
105
105
  and self.get("fbg_value", index)
106
106
  and self.get("ogtt_value", index)
107
+ and self.get("fasting", index)
107
108
  and self.get_next("fbg_value", index)
109
+ and self.get_next("fasting", index)
108
110
  and self.get("fbg_value", index) >= self.fbg_threshhold
109
111
  and self.get("ogtt_value", index) < self.ogtt_threshhold
112
+ and self.get("fasting", index) == YES
110
113
  and self.get_next("fbg_value", index) >= self.fbg_threshhold
111
- and self.fasting(index)
114
+ and self.get_next("fasting", index) == YES
112
115
  and (self.get_next("fbg_datetime", index) - self.get("fbg_datetime", index)).days
113
116
  >= 7
114
117
  )
@@ -117,19 +120,22 @@ class EndpointByDate:
117
120
  return reached
118
121
 
119
122
  def case_three(self, index: int):
120
- """FBG >= 7 x 2, second OGTT<=11.1.
123
+ """FBG >= 7 x 2, second OGTT<11.1.
121
124
 
122
125
  Second FBG must be done with corresponding OGTT.
123
126
  """
124
127
  reached = (
125
128
  self.get_next("fbg_datetime", index)
126
129
  and self.get("fbg_value", index)
130
+ and self.get("fasting", index)
127
131
  and self.get_next("fbg_value", index)
128
132
  and self.get_next("ogtt_value", index)
133
+ and self.get_next("fasting", index)
129
134
  and self.get("fbg_value", index) >= self.fbg_threshhold
135
+ and self.get("fasting", index) == YES
130
136
  and self.get_next("fbg_value", index) >= self.fbg_threshhold
131
137
  and self.get_next("ogtt_value", index) < self.ogtt_threshhold
132
- and self.fasting(index)
138
+ and self.get_next("fasting", index) == YES
133
139
  and (self.get_next("fbg_datetime", index) - self.get("fbg_datetime", index)).days
134
140
  >= 7
135
141
  )
@@ -143,21 +149,24 @@ class EndpointByDate:
143
149
  This is not a protocol endpoint.
144
150
  """
145
151
  reached = (
146
- self.get_next("fbg_datetime", index)
147
- and self.get("fbg_value", index)
152
+ self.get("fbg_value", index)
153
+ and self.get("fbg_datetime", index)
154
+ and self.get("fasting", index)
148
155
  and self.get_next("fbg_value", index)
149
156
  and self.get_next("ogtt_value", index)
157
+ and self.get_next("fbg_datetime", index)
158
+ and self.get_next("fasting", index)
150
159
  and self.get("fbg_value", index) >= self.fbg_threshhold
160
+ and self.get("fasting", index) == YES
151
161
  and self.get_next("fbg_value", index) >= self.fbg_threshhold
152
- and self.fasting(index)
162
+ and self.get_next("fasting", index) == YES
163
+ and (self.get_next("fbg_datetime", index) - self.get("fbg_datetime", index)).days
164
+ >= 7
153
165
  )
154
166
  if reached:
155
167
  self.endpoint_reached(index, case=4, next_is_endpoint=True)
156
168
  return reached
157
169
 
158
- def fasting(self, index) -> bool:
159
- return self.get("fasting", index) == YES and self.get_next("fasting", index) == YES
160
-
161
170
  def sequential_assessments_in_days(self, index) -> int:
162
171
  if not self.get_next("fbg_value", index):
163
172
  raise EndpointTdeltaError
@@ -2,10 +2,15 @@ import numpy as np
2
2
  import pandas as pd
3
3
  from django.apps import apps as django_apps
4
4
  from edc_constants.constants import NO, YES
5
- from edc_pdutils.dataframes import get_crf, get_eos, get_subject_consent
5
+ from edc_pdutils.dataframes import (
6
+ get_crf,
7
+ get_eos,
8
+ get_subject_consent,
9
+ get_subject_visit,
10
+ )
6
11
  from edc_utils import get_utcnow
7
12
 
8
- from .constants import (
13
+ from ..constants import (
9
14
  CASE_EOS,
10
15
  CASE_FBG_ONLY,
11
16
  CASE_FBGS_WITH_FIRST_OGTT,
@@ -14,13 +19,13 @@ from .constants import (
14
19
  endpoint_cases,
15
20
  endpoint_columns,
16
21
  )
17
- from .endpoint_by_date import EndpointByDate
18
- from .utils import (
22
+ from ..utils import (
19
23
  get_empty_endpoint_df,
20
24
  get_test_string,
21
25
  get_unique_subject_identifiers,
22
26
  get_unique_visit_codes,
23
27
  )
28
+ from .endpoint_by_date import EndpointByDate
24
29
 
25
30
 
26
31
  def normalize_date_columns(df: pd.DataFrame, cols: list[str] = None) -> pd.DataFrame:
@@ -83,13 +88,12 @@ class GlucoseEndpointsByDate:
83
88
  self.endpoint_cases = {k: v for k, v in endpoint_cases.items() if k in self.case_list}
84
89
 
85
90
  # merge two model DFs
86
- self.df = pd.merge(
87
- self.glucose_fbg_ogtt_df,
91
+ self.df = self.glucose_fbg_ogtt_df.merge(
88
92
  self.glucose_fbg_df,
89
- on=["subject_visit_id", "fbg_datetime", "fbg_value"],
93
+ on=["subject_visit_id"],
90
94
  how="outer",
91
95
  indicator=True,
92
- suffixes=("", "2"),
96
+ suffixes=("", "_y"),
93
97
  )
94
98
  self.df = self.df.reset_index(drop=True)
95
99
 
@@ -97,13 +101,21 @@ class GlucoseEndpointsByDate:
97
101
  cols = {
98
102
  "fasting": None,
99
103
  "fasting_hrs": np.nan,
104
+ "fbg_value": None,
100
105
  "fbg_units": None,
106
+ "fbg_datetime": None,
101
107
  "source": None,
102
108
  "report_datetime": pd.NaT,
103
109
  }
104
110
  for col, null_value in cols.items():
105
- self.df.loc[self.df["_merge"] == "right_only", col] = self.df[f"{col}2"]
106
- cols = [col for col in self.df.columns if col.endswith("2")]
111
+ self.df.loc[
112
+ (self.df["_merge"].isin(["both", "right_only"])) & (self.df[col].isna()), col
113
+ ] = self.df[f"{col}_y"]
114
+ # if fbg_datetime still null, use visit datetime to sort order
115
+ self.df.loc[(self.df["fbg_datetime"].isna()), "fbg_datetime"] = self.df[
116
+ "visit_datetime"
117
+ ]
118
+ cols = [col for col in self.df.columns if col.endswith("_y")]
107
119
  cols.append("_merge")
108
120
  self.df = self.df.drop(columns=cols)
109
121
  self.df = self.df.reset_index(drop=True)
@@ -163,6 +175,11 @@ class GlucoseEndpointsByDate:
163
175
  subject_identifiers=self.subject_identifiers,
164
176
  subject_visit_model="meta_subject.subjectvisit",
165
177
  )
178
+ # merge w/ subject_visit
179
+ subject_visit_df = get_subject_visit("meta_subject.subjectvisit")
180
+ df = subject_visit_df.merge(
181
+ df, on=["subject_visit_id"], how="left", suffixes=("", "_y")
182
+ )
166
183
  df["source"] = "meta_subject.glucosefbg"
167
184
  df.rename(columns={"fbg_fasting": "fasting"}, inplace=True)
168
185
  df.loc[(df["fasting"] == "fasting"), "fasting"] = YES
@@ -189,6 +206,11 @@ class GlucoseEndpointsByDate:
189
206
  subject_visit_model="meta_subject.subjectvisit",
190
207
  )
191
208
  df["source"] = "meta_subject.glucose"
209
+ # merge w/ subject_visit
210
+ subject_visit_df = get_subject_visit("meta_subject.subjectvisit")
211
+ df = subject_visit_df.merge(
212
+ df, on=["subject_visit_id"], how="left", suffixes=("", "_y")
213
+ )
192
214
  df = calculate_fasting_hrs(df)
193
215
  df = df[self.keep_cols]
194
216
  df = df.reset_index(drop=True)
@@ -270,6 +292,12 @@ class GlucoseEndpointsByDate:
270
292
  & (self.working_df["fasting"] == YES)
271
293
  & (self.working_df["fbg_value"].notna())
272
294
  ].copy()
295
+ subject_endpoint_df.sort_values(by=["subject_identifier", "fbg_datetime"])
296
+ subject_endpoint_df = subject_endpoint_df.reset_index(drop=True)
297
+ subject_endpoint_df = subject_endpoint_df.drop_duplicates(
298
+ subset=["subject_identifier"], keep="first"
299
+ )
300
+ subject_endpoint_df = subject_endpoint_df.reset_index(drop=True)
273
301
  if not subject_endpoint_df.empty:
274
302
  # flag the selected endpoint rows as endpoints
275
303
  subject_endpoint_df["endpoint"] = 1
@@ -344,19 +372,19 @@ class GlucoseEndpointsByDate:
344
372
  subject_df["endpoint_type"] = None
345
373
  subject_df["endpoint_label"] = None
346
374
  subject_df["endpoint"] = 0
347
- subject_df = subject_df.sort_values(["subject_identifier", "fbg_datetime"])
348
- subject_df = subject_df.reset_index(drop=True)
349
375
  subject_df = subject_df[endpoint_columns]
350
- subject_df = subject_df.merge(
351
- self.visit_codes_df,
352
- on="visit_code",
353
- how="outer",
354
- indicator=False,
355
- suffixes=["", "2"],
356
- )
357
- subject_df["subject_identifier"] = subject_identifier
358
- subject_df = subject_df.drop(columns=["count"])
376
+ subject_df = subject_df.sort_values(["subject_identifier", "fbg_datetime"])
359
377
  subject_df = subject_df.reset_index(drop=True)
378
+ # subject_df = subject_df.merge(
379
+ # self.visit_codes_df,
380
+ # on="visit_code",
381
+ # how="outer",
382
+ # indicator=False,
383
+ # suffixes=["", "2"],
384
+ # )
385
+ # subject_df["subject_identifier"] = subject_identifier
386
+ # subject_df = subject_df.drop(columns=["count"])
387
+ # subject_df = subject_df.reset_index(drop=True)
360
388
  return subject_df
361
389
 
362
390
  def check_endpoint_by_fbg_for_subject(
@@ -76,62 +76,158 @@
76
76
  {
77
77
  "cell_type": "code",
78
78
  "execution_count": null,
79
- "id": "df519e75-d536-435e-8c1e-d4087b99d174",
79
+ "id": "b0ebcb02-9d70-43b2-8614-b97ce6fc5aac",
80
80
  "metadata": {},
81
81
  "outputs": [],
82
82
  "source": [
83
- "cls.summarize()"
83
+ "kb_subjects = [\n",
84
+ " \"105-10-0156-6\",\n",
85
+ " \"105-10-0020-4\",\n",
86
+ " \"105-10-0061-8\",\n",
87
+ " \"105-10-0009-7\",\n",
88
+ " \"105-10-0074-1\",\n",
89
+ " \"105-10-0136-8\",\n",
90
+ " \"105-10-0162-4\",\n",
91
+ " \"105-10-0054-3\",\n",
92
+ " \"105-10-0080-8\",\n",
93
+ " \"105-10-0097-2\",\n",
94
+ " \"105-20-0159-9\",\n",
95
+ " \"105-20-0236-5\",\n",
96
+ " \"105-20-0009-6\",\n",
97
+ " \"105-20-0197-9\",\n",
98
+ " \"105-20-0354-6\",\n",
99
+ " \"105-20-0067-4\",\n",
100
+ " \"105-20-0015-3\",\n",
101
+ " \"105-30-0044-2\",\n",
102
+ " \"105-30-0037-6\",\n",
103
+ " \"105-30-0147-3\",\n",
104
+ " \"105-30-0052-5\",\n",
105
+ " \"105-40-0034-2\",\n",
106
+ " \"105-40-0246-2\",\n",
107
+ " \"105-40-0160-5\",\n",
108
+ " \"105-40-0153-0\",\n",
109
+ " \"105-40-0054-0\",\n",
110
+ " \"105-40-0390-8\",\n",
111
+ " \"105-40-0389-0\",\n",
112
+ " \"105-40-0379-1\",\n",
113
+ " \"105-40-0036-7\",\n",
114
+ " \"105-40-0024-3\",\n",
115
+ " \"105-40-0233-0\",\n",
116
+ " \"105-40-0202-5\",\n",
117
+ " \"105-40-0028-4\",\n",
118
+ " \"105-40-0010-2\",\n",
119
+ " \"105-40-0029-2\",\n",
120
+ " \"105-40-0215-7\",\n",
121
+ " \"105-40-0274-4\",\n",
122
+ " \"105-40-0124-1\",\n",
123
+ " \"105-40-0186-0\",\n",
124
+ " \"105-40-0219-9\",\n",
125
+ " \"105-40-0336-1\",\n",
126
+ " \"105-40-0304-9\",\n",
127
+ " \"105-40-0214-0\",\n",
128
+ " \"105-40-0111-8\",\n",
129
+ " \"105-40-0361-9\",\n",
130
+ " \"105-40-0121-7\",\n",
131
+ " \"105-40-0158-9\",\n",
132
+ " \"105-40-0048-2\",\n",
133
+ " \"105-40-0273-6\",\n",
134
+ " \"105-40-0333-8\",\n",
135
+ " \"105-40-0298-3\",\n",
136
+ " \"105-40-0021-9\",\n",
137
+ " \"105-40-0494-8\",\n",
138
+ " \"105-40-0171-2\",\n",
139
+ " \"105-40-0303-1\",\n",
140
+ " \"105-40-0109-2\",\n",
141
+ " \"105-60-0173-6\",\n",
142
+ " \"105-60-0104-1\",\n",
143
+ " \"105-60-0144-7\",\n",
144
+ " \"105-60-0163-7\",\n",
145
+ " \"105-60-0121-5\",\n",
146
+ " \"105-60-0198-3\",\n",
147
+ " \"105-60-0145-4\",\n",
148
+ " \"105-60-0155-3\",\n",
149
+ " \"105-60-0146-2\",\n",
150
+ " \"105-60-0076-1\",\n",
151
+ " \"105-60-0172-8\",\n",
152
+ " \"105-60-0024-1\",\n",
153
+ " \"105-60-0201-5\",\n",
154
+ " \"105-60-0029-0\",\n",
155
+ " \"105-60-0166-0\",\n",
156
+ " \"105-60-0212-2\",\n",
157
+ " \"105-60-0106-6\",\n",
158
+ "]"
84
159
  ]
85
160
  },
86
161
  {
87
162
  "cell_type": "code",
88
163
  "execution_count": null,
89
- "id": "526b5f1a-cc77-4182-b9b4-c17c297344f6",
164
+ "id": "5bee69bb-30db-4b51-9e81-b391ccb63c42",
90
165
  "metadata": {},
91
166
  "outputs": [],
92
167
  "source": [
93
- "# table meta_subject.glucose\n",
94
- "fname = f\"meta-subject-glucose-{datetime.now().strftime(\"%Y-%m-%d-%H%M\")}.csv\"\n",
95
- "get_crf(\"meta_subject.glucose\", subject_visit_model=\"meta_subject.subjectvisit\", drop_columns=[\"consent_model\"]).to_csv(report_folder / fname, sep=\"|\", encoding=\"utf8\", index=False)\n"
168
+ "kb_extras = [s for s in cls.endpoint_only_df[\"subject_identifier\"] if s not in kb_subjects]\n",
169
+ "ew_extras = [s for s in kb_subjects if s not in list(cls.endpoint_only_df[\"subject_identifier\"])]"
96
170
  ]
97
171
  },
98
172
  {
99
173
  "cell_type": "code",
100
174
  "execution_count": null,
101
- "id": "b914aef9-5a27-4474-8359-2d8e0509720b",
175
+ "id": "b3856dc1-cd6e-4886-a89b-e73c064b5f56",
102
176
  "metadata": {},
103
177
  "outputs": [],
104
178
  "source": [
105
- "# table meta_subject.glucosefbg\n",
106
- "fname = f\"meta-subject-glucosefbg-{datetime.now().strftime(\"%Y-%m-%d-%H%M\")}.csv\"\n",
107
- "get_crf(\"meta_subject.glucosefbg\", subject_visit_model=\"meta_subject.subjectvisit\", drop_columns=[\"consent_model\"]).to_csv(report_folder / fname, sep=\"|\", encoding=\"utf8\", index=False)\n"
179
+ "kb_extras"
108
180
  ]
109
181
  },
110
182
  {
111
183
  "cell_type": "code",
112
184
  "execution_count": null,
113
- "id": "66064ddd-51b6-4474-9664-42ecd471e9ce",
185
+ "id": "ecb272b1-341b-4488-90dd-25ce98087dcc",
114
186
  "metadata": {},
115
187
  "outputs": [],
116
188
  "source": [
117
- "# all glucose merged\n",
118
- "fname = f\"glucose-merged-{datetime.now().strftime(\"%Y-%m-%d-%H%M\")}.csv\"\n",
119
- "cls.df.to_csv(report_folder / fname, sep=\"|\", encoding=\"utf8\", index=False)\n"
189
+ "ew_extras"
120
190
  ]
121
191
  },
192
+ {
193
+ "cell_type": "code",
194
+ "execution_count": null,
195
+ "id": "df519e75-d536-435e-8c1e-d4087b99d174",
196
+ "metadata": {},
197
+ "outputs": [],
198
+ "source": []
199
+ },
200
+ {
201
+ "cell_type": "code",
202
+ "execution_count": null,
203
+ "id": "526b5f1a-cc77-4182-b9b4-c17c297344f6",
204
+ "metadata": {},
205
+ "outputs": [],
206
+ "source": []
207
+ },
208
+ {
209
+ "cell_type": "code",
210
+ "execution_count": null,
211
+ "id": "b914aef9-5a27-4474-8359-2d8e0509720b",
212
+ "metadata": {},
213
+ "outputs": [],
214
+ "source": []
215
+ },
216
+ {
217
+ "cell_type": "code",
218
+ "execution_count": null,
219
+ "id": "66064ddd-51b6-4474-9664-42ecd471e9ce",
220
+ "metadata": {},
221
+ "outputs": [],
222
+ "source": []
223
+ },
122
224
  {
123
225
  "cell_type": "code",
124
226
  "execution_count": null,
125
227
  "id": "a8a9da26-84f0-4cc3-a33b-83bf1c292380",
126
228
  "metadata": {},
127
229
  "outputs": [],
128
- "source": [
129
- "# pivot of glucose readings for subjects who have reached\n",
130
- "# an ednpoint\n",
131
- "fname = f\"glucose-pivot-{datetime.now().strftime(\"%Y-%m-%d-%H%M\")}.csv\"\n",
132
- "df_pivot = cls.endpoint_df.sort_values(by=[\"subject_identifier\"]).set_index(\"subject_identifier\").pivot_table(columns=[\"visit_code\"], values=[\"fbg_value\",\"ogtt_value\"], index=[\"subject_identifier\"])\n",
133
- "df_pivot.sort_values(('visit_code'), axis=1).sort_values(\"subject_identifier\").to_csv(report_folder / fname, sep=\"|\", encoding=\"utf8\", index=True)\n"
134
- ]
230
+ "source": []
135
231
  },
136
232
  {
137
233
  "cell_type": "code",
@@ -139,11 +235,7 @@
139
235
  "id": "f97dcfa7-4575-43c1-8614-9f51eb4adff5",
140
236
  "metadata": {},
141
237
  "outputs": [],
142
- "source": [
143
- "# all subjects with endpoint data\n",
144
- "fname = f\"endpoint_df-{datetime.now().strftime(\"%Y-%m-%d-%H%M\")}.csv\"\n",
145
- "cls.endpoint_df.to_csv(report_folder / fname, sep=\"|\", encoding=\"utf8\", index=False)\n"
146
- ]
238
+ "source": []
147
239
  },
148
240
  {
149
241
  "cell_type": "code",
@@ -151,9 +243,7 @@
151
243
  "id": "b394252c-443c-49a9-9f32-77a686d00067",
152
244
  "metadata": {},
153
245
  "outputs": [],
154
- "source": [
155
- "# len(cls.endpoint_only_df)"
156
- ]
246
+ "source": []
157
247
  },
158
248
  {
159
249
  "cell_type": "code",
@@ -161,9 +251,7 @@
161
251
  "id": "82634927-c2bf-4745-9fdf-841a1fec008b",
162
252
  "metadata": {},
163
253
  "outputs": [],
164
- "source": [
165
- "# len(cls.endpoint_only_df[\"subject_identifier\"].unique())"
166
- ]
254
+ "source": []
167
255
  },
168
256
  {
169
257
  "cell_type": "code",
@@ -171,10 +259,7 @@
171
259
  "id": "dc597ae7-d66e-4e1f-9f69-b35dd2d28ec4",
172
260
  "metadata": {},
173
261
  "outputs": [],
174
- "source": [
175
- "# subject_identifier = \"105-10-0064-2\"\n",
176
- "# cls.df[cls.df[\"subject_identifier\"]==subject_identifier][[\"visit_code\", \"fbg_datetime\", \"fasting\", \"fbg_value\", \"ogtt_value\"]]"
177
- ]
262
+ "source": []
178
263
  }
179
264
  ],
180
265
  "metadata": {
@@ -193,7 +278,7 @@
193
278
  "name": "python",
194
279
  "nbconvert_exporter": "python",
195
280
  "pygments_lexer": "ipython3",
196
- "version": "3.12.2"
281
+ "version": "3.12.4"
197
282
  }
198
283
  },
199
284
  "nbformat": 4,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meta-edc
3
- Version: 0.3.31
3
+ Version: 0.3.33
4
4
  Summary: META Trial EDC (http://www.isrctn.com/ISRCTN76157257)
5
5
  Home-page: https://github.com/meta-trial/meta-edc
6
6
  Author: Erik van Widenfelt
@@ -20,7 +20,7 @@ Requires-Python: >=3.12
20
20
  Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE
22
22
  License-File: AUTHORS
23
- Requires-Dist: edc ==0.6.9
23
+ Requires-Dist: edc ==0.6.10
24
24
  Requires-Dist: edc-microscopy
25
25
  Requires-Dist: beautifulsoup4
26
26
  Requires-Dist: edc-analytics
@@ -85,18 +85,18 @@ meta_analytics/README.rst,sha256=x5KDks1P2bSPdyq3f9CNkynAAgJaXl7AX_3rnmC16HU,357
85
85
  meta_analytics/__init__.py,sha256=kw_E-hvxNPuGxraTF6L5MFzADYn3vTSmww1vcGr96CQ,104
86
86
  meta_analytics/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  meta_analytics/get_tables.py,sha256=KDCFdzQmwtCdTrMrODpEDHQXVNzztOa8UiqV6C4hzlc,3043
88
- meta_analytics/dataframes/__init__.py,sha256=yJQS5Ix7QTSGFwNnebSVMwYXAtxGQXxTtEOropiw-1A,138
88
+ meta_analytics/dataframes/__init__.py,sha256=EsDu7Dn6mz4yz2enKyrdZiQKN224VwcD7VqTzYGdYjs,453
89
+ meta_analytics/dataframes/constants.py,sha256=XIt19uf5aSxiOVzkvHtUHs1RJo-1XqJLQOySOJvhQb8,789
90
+ meta_analytics/dataframes/utils.py,sha256=2V3nFFnaysuJvNrcHUOLqOk8e_3aP71079kB_YBXcQw,2014
89
91
  meta_analytics/dataframes/enrolled/__init__.py,sha256=uKniE7L86umlSmGOjAFuwwsbyZj31mELGUpY3hByo4s,43
90
92
  meta_analytics/dataframes/enrolled/get_glucose_df.py,sha256=L4gzszNjYzu-QmYu4gs1c7_Edcv7FgAjucihxHtANSY,5004
91
93
  meta_analytics/dataframes/glucose_endpoints/__init__.py,sha256=a9RlAnFM0Z4AKw-WztBvnGMo3tLLe1dx3292A2n_CnA,107
92
- meta_analytics/dataframes/glucose_endpoints/constants.py,sha256=XIt19uf5aSxiOVzkvHtUHs1RJo-1XqJLQOySOJvhQb8,789
93
- meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py,sha256=MOIcrrdH26q2zrmQDXE-lxHg9klNuKjRjDAc4Elc9ZE,6506
94
- meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py,sha256=Lqfa8YXiOJXrGNyXrbqOLXhkygZjtE5pGgemyYgeVik,19288
95
- meta_analytics/dataframes/glucose_endpoints/utils.py,sha256=2V3nFFnaysuJvNrcHUOLqOk8e_3aP71079kB_YBXcQw,2014
94
+ meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py,sha256=aOadsfeclOEGFo5agSZUbY2NdM8iZDsOLdg-5j8aelg,7011
95
+ meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py,sha256=rWbCTg4D35Gp2BI3DjWZcfBOiMCwwTMyjewXsRNk1YE,20489
96
96
  meta_analytics/dataframes/screening/__init__.py,sha256=onGpmB4474gu_JcyRGdRy09YQyP2Np-mX-rYZTFdJoA,114
97
97
  meta_analytics/dataframes/screening/get_glucose_tested_only_df.py,sha256=0oMJIsIJRjurfpPONuJ4Aoab1UJikezGe3lQNWRoOo4,660
98
98
  meta_analytics/dataframes/screening/get_screening_df.py,sha256=_6AmaHvH06ubFGiQB6XbVRkVGE5kvtbVbDfs7k5TPX8,4854
99
- meta_analytics/notebooks/meta_endpoints.ipynb,sha256=dvLNb8nsCjM7upQhj7LIwwdv0Hv5gK54wAgfVAw0qXw,5816
99
+ meta_analytics/notebooks/meta_endpoints.ipynb,sha256=cmdGX_sKa32AfwWzOXmSS-9oB3Lxhuy5c-FbQdSgMFs,7118
100
100
  meta_analytics/tables/__init__.py,sha256=mhESCt0Lq4RJU-lbQ5fVfIbXzrEsootGYp7EzQIqDBI,70
101
101
  meta_analytics/tables/eligible.py,sha256=2q-SMbAsrBgOVc4Ttq5P3bpjsUKwP5hYhJBMgyH6GGI,3389
102
102
  meta_analytics/tables/has_dm.py,sha256=W6pObFI7k2hpL46Q7t2QIfYDVfo7-PHJMdCv6Q5EUQk,1739
@@ -438,7 +438,7 @@ meta_reports/admin/__init__.py,sha256=W9unT8v7A8yHLn0WS8Wn4ZRk6W32POBS-ePh1UA-DH
438
438
  meta_reports/admin/endpoints_admin.py,sha256=L4mDLNIkR6203RI3ImBYel2kevaH_Nwa6KMYuoDwyNU,518
439
439
  meta_reports/admin/endpoints_all_admin.py,sha256=_czdezZf9fSjwZJmO-3HbmdXrXP6nk8-HdiweqUzPRE,476
440
440
  meta_reports/admin/list_filters.py,sha256=pByBzz9-qGwqBfdZFlByxJUZDTJQXOTWfNLjmK8KF00,870
441
- meta_reports/admin/modeladmin_mixins.py,sha256=9Fv3G3dPGl5EVlmKw2zhEsxEoTKAA2wOdET9vdVuWZ0,3669
441
+ meta_reports/admin/modeladmin_mixins.py,sha256=RhdkF5W9ccuwaX5NTMF4b9shQJgDFaOlj7ENOTBAG0g,3669
442
442
  meta_reports/admin/dbviews/__init__.py,sha256=5NoJxTvBaZX0hJnE9Bf-HyJBEgGd59Hebj50Q23gguk,616
443
443
  meta_reports/admin/dbviews/glucose_summary_admin.py,sha256=NqnDKx5l0Q-2xxRGdnf50DaRX1Sn8-DC0jHSk96LkRo,4005
444
444
  meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py,sha256=XyroEqxlX816xrdi0IVSelNPxPBWi96niKa-MQVGkck,2058
@@ -499,7 +499,7 @@ meta_reports/migrations/0039_onstudymissingvalues.py,sha256=Tpr_0vujhzWEDYKKBNJe
499
499
  meta_reports/migrations/0040_auto_20240824_0412.py,sha256=mgUvizbsZUqEVDxu4EMymJ0L2vKaoAxyhjZkc1dUFDI,67126
500
500
  meta_reports/migrations/0041_auto_20240828_2229.py,sha256=BpbbBqzo9WED5owo30w-UBDX9ReJfOxQjyFEsNCMcp0,302
501
501
  meta_reports/migrations/0042_onstudymissinglabvalues.py,sha256=zSEgSrjOe19d3s9XoPkx9ZzirchII9KQblU-cnrcEyY,1783
502
- meta_reports/migrations/0043_auto_20240828_2309.py,sha256=AAlPRv6b6nE7QDwfyvY-GF9Q_EgiIdqiL_qDr3PpypE,88807
502
+ meta_reports/migrations/0043_auto_20240828_2309.py,sha256=ZQUFjpWb6Jl2__ghkXL_gviCRjOD5DMC2DS0YaZrlp4,88894
503
503
  meta_reports/migrations/0044_auto_20240828_2323.py,sha256=oOuxdpmk3NjdkljjqtSHOPv-C2cFNgHquTz-qjPwff4,143236
504
504
  meta_reports/migrations/0045_auto_20240829_0248.py,sha256=V9F3yLQsbvUL40Fei3FrhBB4t7eReGGW4tnkx2lAjrw,33850
505
505
  meta_reports/migrations/0046_auto_20240829_0250.py,sha256=lKVlj7LrkOJ49LJxccYvQdYEZhnSKTcZEcZMYj7h9q8,30676
@@ -1123,9 +1123,9 @@ tests/etc/user-rsa-restricted-private.pem,sha256=CUcHW9bznWdmmASN00hCzvxFPAFl4N2
1123
1123
  tests/etc/user-rsa-restricted-public.pem,sha256=mt84djoL-uHw6Wc5SJh0zml6VzXulnf8eQSFg7-fheg,450
1124
1124
  tests/etc/user-salt-local.key,sha256=x5anBw9fvbHurczouT3CjrkWb_xs7Ypm1htIJsgiuiw,256
1125
1125
  tests/etc/user-salt-restricted.key,sha256=pxmpcfBRNB-4C6wTvHXz-9fOfJgKIFOjaAF8ZFfa4q4,256
1126
- meta_edc-0.3.31.dist-info/AUTHORS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1127
- meta_edc-0.3.31.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1128
- meta_edc-0.3.31.dist-info/METADATA,sha256=bXhH4QYN6UYUyqD7xHibhRUlgh3S-tLKWInug-Rko4U,2810
1129
- meta_edc-0.3.31.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
1130
- meta_edc-0.3.31.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1131
- meta_edc-0.3.31.dist-info/RECORD,,
1126
+ meta_edc-0.3.33.dist-info/AUTHORS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1127
+ meta_edc-0.3.33.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1128
+ meta_edc-0.3.33.dist-info/METADATA,sha256=jWZeykN68G-2vi6uWOB1U6hKVx_BeJ4gEudLbml9sqQ,2811
1129
+ meta_edc-0.3.33.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
1130
+ meta_edc-0.3.33.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1131
+ meta_edc-0.3.33.dist-info/RECORD,,
@@ -36,7 +36,7 @@ class EndpointsModelAdminMixin(
36
36
  ):
37
37
  queryset_filter: dict | None = None
38
38
  actions = [update_endpoints_table_action]
39
- qa_report_list_display_insert_pos = 2
39
+ qa_report_list_display_insert_pos = 3
40
40
  ordering = ["-fbg_datetime"]
41
41
  list_display = [
42
42
  "dashboard",
@@ -9,6 +9,7 @@ class Migration(migrations.Migration):
9
9
 
10
10
  dependencies = [
11
11
  ("meta_reports", "0042_onstudymissinglabvalues"),
12
+ ("meta_subject", "0213_rename_bloodresultslipid_bloodresultslipids_and_more"),
12
13
  ]
13
14
 
14
15
  operations = [