Skip to content
Snippets Groups Projects
Verified Commit 703f372f authored by jindra12's avatar jindra12
Browse files

Automatically add complementary fields to union

parent ae189d94
No related branches found
No related tags found
2 merge requests!816Release,!801Prepare basic shared tags
Pipeline #13912 passed
......@@ -429,10 +429,19 @@ class ArticlesMixin(models.Model):
district_meta_fields = DistrictArticlePage._meta.fields
uniweb_meta_fields = UniwebArticlePage._meta.fields
# dictionary of class types of fields, assumes that a field cannot have a different type in each web
fields_dict = reduce(
lambda class_dict, field: self.merge_dict(
class_dict, {f"union_{field.column}": field}
),
[*main_meta_fields, *district_meta_fields, *uniweb_meta_fields],
{},
)
fields_reducer = (
lambda assigned, field: assigned
if field.column == "shared_from_id" or field.column == "shared_type"
else assigned | {f"union_{field.column}": F(field.column)}
else self.merge_dict(assigned, {f"union_{field.column}": F(field.column)})
)
setup_fields_order = lambda orderBy, orderFrom: reduce(
lambda orderTo, field: self.merge_dict(orderTo, {field: orderFrom[field]}),
......@@ -440,34 +449,69 @@ class ArticlesMixin(models.Model):
{},
)
main_fields = reduce(fields_reducer, main_meta_fields, {}) | {
district_only_fields = reduce(fields_reducer, district_meta_fields, {})
uniweb_only_fields = reduce(fields_reducer, uniweb_meta_fields, {})
main_only_fields = reduce(fields_reducer, main_meta_fields, {})
key_fields_default_values = {
"union_thumb_image_id": F("search_image_id"),
"union_article_type": Value(2, models.PositiveSmallIntegerField()),
}
create_complementary_field = lambda key: (
key_fields_default_values[key]
if key in key_fields_default_values
else (
# any type will suffice in the foreign key
Value(
None,
models.ForeignKey(
DistrictArticlePage, blank=True, on_delete=models.SET_NULL
),
)
if isinstance(fields_dict[key], models.ForeignKey)
else Value(None, fields_dict[key].__class__())
)
)
reduce_complementary_fields = lambda complementary, item, notIn: (
self.merge_dict(
complementary, {item[0]: create_complementary_field(item[0])}
)
if item[0] not in notIn
else complementary
)
create_complementary_fields = lambda notIn, fromFields: reduce(
lambda complementary, item: reduce_complementary_fields(
complementary, item, dict(notIn)
),
reduce(
lambda sources, source: sources + list(source.items()), fromFields, []
),
{},
)
district_complementary_fields = create_complementary_fields(
district_only_fields, [uniweb_only_fields, main_only_fields]
)
uniweb_complementary_fields = create_complementary_fields(
uniweb_only_fields, [district_only_fields, main_only_fields]
)
main_complementary_fields = create_complementary_fields(
main_only_fields, [uniweb_only_fields, district_only_fields]
)
main_fields = main_only_fields | main_complementary_fields
district_fields = setup_fields_order(
main_fields,
reduce(fields_reducer, district_meta_fields, {})
| {
"union_region": Value(None, models.CharField()),
"union_article_type": Value(2, models.PositiveSmallIntegerField()),
},
district_only_fields | district_complementary_fields,
)
uniweb_fields = setup_fields_order(
main_fields,
reduce(fields_reducer, uniweb_meta_fields, {})
| {
"union_author_page_id": Value(
None,
output_field=models.ForeignKey(
DistrictArticlePage, blank=True, on_delete=models.SET_NULL
),
),
"union_region": Value(None, models.CharField()),
"union_article_type": Value(2, models.PositiveSmallIntegerField()),
"union_is_black": Value(False, models.BooleanField()),
"union_thumb_image_id": F("search_image_id"),
},
uniweb_only_fields | uniweb_complementary_fields,
)
district_article_query: models.QuerySet = DistrictArticlePage.objects
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment