From 2a8d5c579b38479fe74ebc3b79f8e5582602f155 Mon Sep 17 00:00:00 2001 From: Jakub Kadlcik Date: Apr 30 2021 17:01:06 +0000 Subject: frontend: show deletion tooltip in project overview In the project overview, we currently show all available repositories as opposite to just chroots that are enabled in the project settings. On top enabled chroots, also EOL chroots and chroots that were disabled by the project owner, that are not expired yet. This is a kind step towards people that use systems that are not supported anymore but their repositories haven't been shutdown yet. However, it can be a bit confusing for project owners because they might e.g. go to the project settings, unclick some chroot, submit the form, which will redirect them to the project overview and the same chroot is there for some reason. And yet they cannot see it enabled in the project settings, ... I am adding a small icon indication that the chroot is there temporarily and that it is going to be deleted in XY days. Unfortunatelly such a simple change required a bit of refactoring because when generating the repositories, we operated over mock_chroots instead of copr_chroots and therefore there wasn't any project-specific information available. --- diff --git a/frontend/coprs_frontend/coprs/models.py b/frontend/coprs_frontend/coprs/models.py index 0061d76..e55b73d 100644 --- a/frontend/coprs_frontend/coprs/models.py +++ b/frontend/coprs_frontend/coprs/models.py @@ -435,19 +435,28 @@ class Copr(db.Model, helpers.Serializer): return [cc.mock_chroot for cc in self.active_copr_chroots] @property - def enable_permissible_chroots(self): + def enable_permissible_copr_chroots(self): """ - Return the list of not-yet-deleted (includes EOLed) mock_chroots + Return the list of not-yet-deleted (includes EOLed) copr_chroots assigned to this copr. """ permissible_states = [ ChrootDeletionStatus("active"), ChrootDeletionStatus("preserved"), ] - return [cc.mock_chroot for cc in self.copr_chroots + return [cc for cc in self.copr_chroots if cc.delete_status in permissible_states] @property + def enable_permissible_chroots(self): + """ + Return the list of not-yet-deleted (includes EOLed) mock_chroots + assigned to this copr. + """ + return [cc.mock_chroot for cc in self.enable_permissible_copr_chroots] + + + @property def active_multilib_chroots(self): """ Return list of active mock_chroots which have the 32bit multilib diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html index 70836ae..6412cf0 100644 --- a/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html +++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html @@ -72,6 +72,11 @@ {% endfor %} {% endif %} ({{ repo.dl_stat }} downloads) + + {% if repo.delete_reason %} + + {% endif %} + {% endfor %} diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py index 5dc581e..b0f47d6 100644 --- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py +++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py @@ -318,7 +318,7 @@ def render_copr_detail(copr): repo_dl_stat = CounterStatLogic.get_copr_repo_dl_stat(copr) form = forms.CoprLegalFlagForm() repos_info = {} - for chroot in copr.enable_permissible_chroots: + for chroot in copr.enable_permissible_copr_chroots: chroot_rpms_dl_stat_key = CHROOT_RPMS_DL_STAT_FMT.format( copr_user=copr.owner_name, copr_project_name=copr.name, @@ -336,28 +336,38 @@ def render_copr_detail(copr): if fnmatch.fnmatch(logo, "*.png"): logoset.add(logo[:-4]) - if chroot.name_release not in repos_info: + mc = chroot.mock_chroot + if mc.name_release not in repos_info: logo = None - if chroot.name_release in logoset: - logo = chroot.name_release + ".png" - elif chroot.os_release in logoset: - logo = chroot.os_release + ".png" - - repos_info[chroot.name_release] = { - "name_release": chroot.name_release, - "os_release": chroot.os_release, - "os_version": chroot.os_version, + if mc.name_release in logoset: + logo = mc.name_release + ".png" + elif mc.os_release in logoset: + logo = mc.os_release + ".png" + + delete_reason = None + if chroot.delete_status: + delete_reason = ("This chroot {0} and its repository will " + "remain available for another {1} days".format( + "was disabled by a project owner" + if chroot.is_active else "is EOL", + chroot.delete_after_days)) + + repos_info[mc.name_release] = { + "name_release": mc.name_release, + "os_release": mc.os_release, + "os_version": mc.os_version, "logo": logo, - "arch_list": [chroot.arch], - "repo_file": "{}-{}.repo".format(copr.repo_id, chroot.name_release), - "dl_stat": repo_dl_stat[chroot.name_release], + "arch_list": [mc.arch], + "repo_file": "{}-{}.repo".format(copr.repo_id, mc.name_release), + "dl_stat": repo_dl_stat[mc.name_release], "rpm_dl_stat": { - chroot.arch: chroot_rpms_dl_stat - } + mc.arch: chroot_rpms_dl_stat + }, + "delete_reason": delete_reason, } else: - repos_info[chroot.name_release]["arch_list"].append(chroot.arch) - repos_info[chroot.name_release]["rpm_dl_stat"][chroot.arch] = chroot_rpms_dl_stat + repos_info[mc.name_release]["arch_list"].append(chroot.arch) + repos_info[mc.name_release]["rpm_dl_stat"][chroot.arch] = chroot_rpms_dl_stat if copr.multilib: for name_release in repos_info: