RamezIssac / django-slick-reporting

The Reporting Engine for Django. Create dashboards and standalone Reports and Charts.
https://django-slick-reporting.com/
BSD 3-Clause "New" or "Revised" License
549 stars 44 forks source link

Search will not work for Foreign Key fields with "to_field" attribute set. #34

Closed dgurovich closed 1 year ago

dgurovich commented 3 years ago

I am building a complex app with many Foreign Key fields on a particular model that I'm reporting on. All of the filter/search features work, EXCEPT in one instance, where I have the "to_field" set to make the rest of the system work correctly. It just returns nothing found, no errors, etc...

Is this a known issue? Here is the some code.

class Architect(models.Model): """ A lookup table for CX Enterprise Architects, used mostly for reporting purposes. Associated with Initiatives and Features. """ id = models.AutoField(primary_key=True) name = models.CharField(max_length=60, verbose_name="Lead Architect", null=False, unique=True, blank=False, db_index=True)

class Initiative(models.Model): id = models.AutoField(primary_key=True)
null=True) cx_pem = models.ForeignKey(ProjectEngineeringManager, on_delete=models.DO_NOTHING, verbose_name="CX PEM:", null=True, blank=True architect = models.ForeignKey(Architect, on_delete=models.DO_NOTHING, verbose_name="CX Architect:", null=True, blank=True, to_field="name"

Note that the "architect" field has "to_field" set None of the my other models needed this.

RamezIssac commented 3 years ago

Hello ... i will check this code out.. never had to set to_field in my use cases... so there might be something .

RamezIssac commented 3 years ago

@dgurovich Can you please also share with me a copy of your ReportView or ReportGenerator code ?

dgurovich commented 3 years ago

Hi! Back to this. Here is the view. I had used CSS to just blank it out, but now there's a use case for it.

class LBCbyPEMs(SlickReportView): """ Shows LBC Initiatives filtered by PEMs """ report_title = 'Epics Dashboard' template_name = 'slick_reporting/lbc_report.html' report_model = Initiative date_field = 'req_date' columns = ['lbc_unique_id', 'name', 'epic_statusstatus', 'c_x_pm', 'cx_pem__name', 'cx_tenetacronym', 'epic_status__status', 'color_status__description']

def format_row(self, row_obj):
    row_obj['lbc_unique_id'] = safe(
        f"<a href=\"/lbc/{row_obj['lbc_unique_id']}/epic_main/\" style=\"color:#1295E5;\">"
        f"{condition_id_digits(int(row_obj['lbc_unique_id']))}</a>")
    row_obj['name'] = row_obj['name'][0:50]
    return row_obj
dgurovich commented 2 years ago

Any progress on this? It's come up again and I'd like to not have to create a work-around.

dgurovich commented 2 years ago

Interestingly, the fields show up in the filter view, but the default values from the model are defaulted into the filters and not removeable! I had to remove the defaults in the model to make it work. When I set a filter though, just returns nothing.

RamezIssac commented 2 years ago

Hello @dgurovich I added a Foreign Key with a to_field set in my tests and all is passing and nothing seems off

I want to understand and be able to reproduce it...

You mean that the form select is not loading the expected values ? Or it loads correct values but when you filter on ReportGeneratorView returns no data ?

The example above , the report view class does not have an 'architect' column or anything...

dgurovich commented 2 years ago

The filters show the default values in them with no way to remove. Also, the addition of any filter returns no items in the table.

Here is the model:

`class OKR(models.Model): """Business Object Mapping Objectives and Key Results to Epics"""

COMPLETE = 2
INCOMPLETE = 1

DEFAULT_VALUE_STREAM_CHOICE = "TBD"

KEY_RESULT_PROGRESS_CHOICES = (
    (0, "0%"), (1, "1%"), (10, "10%"), (20, "20%"), (30, "30%"), (40, "40%"), (50, "50%"),
    (60, "60%"), (70, "70%"), (80, "80%"), (90, "90%"), (100, "100%"),)

KEY_RESULT_STATUS_CHOICES = ((INCOMPLETE, "Incomplete"), (COMPLETE, "Achieved"),)

id = models.AutoField(primary_key=True)
key_result_progress = models.IntegerField(verbose_name="Key Result Progress:",
                                          choices=KEY_RESULT_PROGRESS_CHOICES, default=0,
                                          blank=False)
key_result_description = models.TextField(verbose_name="Key Result (description):", null=False,
                                          blank=False)
value_stream = models.ForeignKey(
    ValueStream, to_field="name", db_column="value_stream", verbose_name="Value Stream",
    db_index=True, on_delete=models.DO_NOTHING, blank=False)
objective = models.ForeignKey(EpicObjective, to_field="name", db_column="objective",
                              verbose_name="Objective:", on_delete=models.DO_NOTHING,
                              blank=False)
lob = models.ForeignKey(LineOfBusiness, to_field="lob", db_column="lob",
                        verbose_name="Line of Business", db_index=True,
                        on_delete=models.DO_NOTHING, blank=False)
okr_progress = models.ForeignKey(OKRProgress, to_field="status", db_column="okr_progress",
                                 verbose_name="OKR Progress",
                                 on_delete=models.DO_NOTHING, blank=False)
product_area = models.ForeignKey(ProductArea, to_field="name", db_column="product_area",
                                 verbose_name="Product Area", db_index=True,
                                 on_delete=models.DO_NOTHING, blank=False)
key_result_status = models.IntegerField(verbose_name="Key Result Status:",
                                        choices=KEY_RESULT_STATUS_CHOICES,
                                        blank=False, default=INCOMPLETE)
start_date = models.DateField(verbose_name="Start Date: &#128197;", blank=True,
                              null=True,
                              help_text=globals.DATEPICKER)
due_date = models.DateField(verbose_name="Due Date: &#128197;", blank=True,
                            null=True,
                            help_text=globals.DATEPICKER)
start_value = models.IntegerField(verbose_name="Start Value", default=1,
                                  validators=[MinValueValidator(1), MaxValueValidator(100)],
                                  help_text=globals.ONE_ONE_HUNDRED_VALIDATOR_HELP)
current_value = models.IntegerField(verbose_name="Current Value", default=1,
                                    validators=[MinValueValidator(1), MaxValueValidator(100)],
                                    help_text=globals.ONE_ONE_HUNDRED_VALIDATOR_HELP)
target_value = models.IntegerField(verbose_name="Target Value", default=100,
                                   validators=[MinValueValidator(1), MaxValueValidator(100)],
                                   help_text=globals.ONE_ONE_HUNDRED_VALIDATOR_HELP)

class Meta:
    """
    Metadata elements.
    """
    managed = True
    verbose_name = "OKR"
    verbose_name_plural = "OKRs"
    ordering = ['lob', 'value_stream']

def unassigned_okrs(self):
    okrs = OKR.objects.filter(lob="Unassigned - TBD")
    return okrs

def __str__(self):
    """
    To String Function
    :return: String Representation of model
    """
    return f"LOB: {self.lob.lob} - Value Stream: {self.value_stream} - Impact: {self.product_area} - Product Lead: {self.lob.head_of_product}"

`

RamezIssac commented 2 years ago

Hello ! Sorry but i have to ask you If you can send a print screen to share, that would be awesome if possible. also the actual code of the problem Report View.

In the code, i can see i'm assuming '_id' field only in crosstab reports. is your report a crosstab one ?

dgurovich commented 2 years ago

Simple report. Vanilla

dgurovich commented 2 years ago

okrs_no_filter

dgurovich commented 2 years ago

okrs_filtered

dgurovich commented 2 years ago

The first shot is no filters, The second one shows with a filter selected -- it should have returned quite a few.

dgurovich commented 2 years ago

interesting that the headers don't render html chars (fontawesome).

RamezIssac commented 2 years ago

Letting you know that i got it on tests :muscle: .. soon will be fixed i hope

dgurovich commented 2 years ago

Wow! Thx

On Wed, Dec 15, 2021, 16:42 Ramez Ashraf @.***> wrote:

Letting you know that i got it on tests 💪 .. soon will be fixed i hope

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/ra-systems/django-slick-reporting/issues/34#issuecomment-995236011, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABHAP6R27TRIUXNTKOZDOLDUREDTRANCNFSM46H2HTNA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

RamezIssac commented 1 year ago

The issue is fixed on the branch https://github.com/ra-systems/django-slick-reporting/tree/34_to_field_set_issues Will be merging with the upcoming release

RamezIssac commented 1 year ago

Hello :hand: Fixed and released, Thank you @dgurovich