Skip to content

Commit

Permalink
Allow the listing of already included patches when importing them int…
Browse files Browse the repository at this point in the history
…o a custom channel
  • Loading branch information
wweellddeerr committed Aug 16, 2024
1 parent b000ba4 commit 2ec6c55
Show file tree
Hide file tree
Showing 10 changed files with 103 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,49 @@ SELECT DISTINCT E.id, E.advisory_name AS advisory_name,
<elaborator name="errata_flags"/>
</mode>

<mode name="in_sources_for_target_with_already_included" class="com.redhat.rhn.frontend.dto.ErrataOverview">
<query params="custom_cid, user_id">
SELECT DISTINCT E.id , E.advisory AS advisory,
E.update_date AS UPDATE_DATE,
E.synopsis as ADVISORY_SYNOPSIS,
E.advisory_type as ADVISORY_TYPE,
E.advisory_name AS advisory_name,
E.advisory_status
FROM rhnErrata E
INNER JOIN rhnChannelErrata CE ON E.id = CE.errata_id
LEFT JOIN
(SELECT errata_id from rhnChannelErrata where channel_id = :custom_cid) errata_exists
ON errata_exists.errata_id = E.id,
rhnSet S
WHERE CE.channel_id = S.element
AND S.label = 'channels_for_errata'
AND errata_exists.errata_id is null
AND S.user_id = :user_id
</query>
<elaborator name="errata_flags"/>
</mode>

<mode name="in_sources_for_target_package_assoc_with_already_included" class="com.redhat.rhn.frontend.dto.ErrataOverview">
<query params="custom_cid, user_id">
SELECT DISTINCT E.id, E.advisory_name AS advisory_name,
E.update_date AS UPDATE_DATE,
E.synopsis as ADVISORY_SYNOPSIS,
E.advisory_type as ADVISORY_TYPE,
E.advisory_status
FROM rhnErrata E
INNER JOIN rhnChannelErrata CE ON CE.errata_id = E.id
INNER JOIN rhnSet S on S.element = CE.channel_id
INNER JOIN rhnErrataPackage EP ON EP.errata_id = E.id
INNER JOIN rhnPackage P ON p.id = EP.package_id
INNER JOIN rhnPackage P2 ON P.name_id = P2.name_id
INNER JOIN rhnChannelPackage CP ON P2.id = CP.package_id
WHERE CP.channel_id = :custom_cid
AND S.user_id = :user_id
AND S.label = 'channels_for_errata'
AND E.id not in (select errata_id from rhnChannelErrata where channel_id = :custom_cid)
</query>
<elaborator name="errata_flags"/>
</mode>

<mode name="for_target" class="com.redhat.rhn.frontend.dto.ErrataOverview">
<query params="custom_cid">
Expand Down
9 changes: 9 additions & 0 deletions java/code/src/com/redhat/rhn/domain/channel/Channel.hbm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,15 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<![CDATA[select cp.package_id from rhnChannelPackage cp where cp.channel_id = :cid]]>
</sql-query>

<sql-query name="Channel.getClonedErrataOriginalIdList">
<return-scalar type="long" column="original_id"/>
<![CDATA[SELECT errataCloned.original_id
FROM rhnChannelErrata channelErrata
INNER JOIN rhnErrataCloned errataCloned ON errataCloned.id = channelErrata.errata_id
WHERE channelErrata.channel_id = :cid
]]>
</sql-query>

<sql-query name="Channel.isAccessibleBy">
<return-scalar type="int" column="result"/>
<![CDATA[SELECT case when (EXISTS (
Expand Down
12 changes: 12 additions & 0 deletions java/code/src/com/redhat/rhn/domain/channel/ChannelFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -741,6 +741,18 @@ public static List<Long> getPackageIds(Long cid) {
return singleton.listObjectsByNamedQuery("Channel.getPackageIdList", Map.of("cid", cid));
}

/**
* Get cloned errata ids for a channel
* @param cid the channel id
* @return List of errata ids
*/
public static List<Long> getClonedErrataIds(Long cid) {
if (cid == null) {
return new ArrayList<>();
}
return singleton.listObjectsByNamedQuery("Channel.getClonedErrataOriginalIdList", Map.of("cid", cid));
}

/**
* Looksup the number of Packages in a channel
* @param channel the Channel who's package count you are interested in.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ protected DataResult<ErrataOverview> getData(HttpServletRequest request,
set.addElement(selectedChan.getId());
RhnSetManager.store(set);
return ChannelManager.findErrataFromRhnSetForTarget(currentChan,
packageAssoc, user);
packageAssoc, false, user);
}
else if (selChannelList != null) {
RhnSet set = RhnSetDecl.CHANNELS_FOR_ERRATA.get(user);
Expand All @@ -231,7 +231,7 @@ else if (selChannelList != null) {
}
RhnSetManager.store(set);
return ChannelManager.findErrataFromRhnSetForTarget(currentChan,
packageAssoc, user);
packageAssoc, false, user);
}
else {
return ChannelManager.findCustomErrataForTarget(currentChan,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
Expand Down Expand Up @@ -82,6 +83,7 @@ public ActionForward execute(ActionMapping mapping,
}

List<Long> channelPacks = ChannelFactory.getPackageIds(currentChan.getId());
List<Long> clonedErrataOriginalIds = ChannelFactory.getClonedErrataIds(currentChan.getId());

for (Long pid : packageIds) {
if (!channelPacks.contains(pid)) {
Expand All @@ -95,7 +97,10 @@ public ActionForward execute(ActionMapping mapping,
// user).getElementValues();
//ErrataManager.publishErrataToChannelAsync(currentChan, errataIds, user);
List<ErrataOverview> errata = ErrataManager.errataInSet(user,
RhnSetDecl.setForChannelErrata(currentChan).get(user).getLabel());
RhnSetDecl.setForChannelErrata(currentChan).get(user).getLabel())
.stream()
.filter(it -> !clonedErrataOriginalIds.contains(it.getId()))
.collect(Collectors.toList());
Set<Long> eids = ErrataManager.cloneChannelErrata(errata, currentChan.getId(),
user);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public class AddRedHatErrataAction extends RhnListAction {
private static final String CHANNEL_SUBMIT = "frontend.actions.channels.manager." +
"add.viewErrata";
private static final String CHECKED = "assoc_checked";
private static final String LIST_ALREADY_INCLUDED_PATCH = "list_already_included";

private static final String SUBMITTED = "frontend.actions.channels.manager." +
"add.submit";
Expand Down Expand Up @@ -97,6 +98,7 @@ public ActionForward execute(ActionMapping mapping,
List<SelectableChannel> channelList;
String selectedChannelStr;
boolean checked = true;
boolean listAlreadyIncludedPatches = true;


//Set initail strings
Expand Down Expand Up @@ -130,6 +132,10 @@ public ActionForward execute(ActionMapping mapping,
checked = false;
}

if (requestContext.isSubmitted() && request.getParameter(LIST_ALREADY_INCLUDED_PATCH) == null) {
listAlreadyIncludedPatches = false;
}

request.setAttribute(CHECKED, checked);
request.setAttribute(SELECTED_CHANNEL, selectedChannelStr);

Expand Down Expand Up @@ -157,7 +163,8 @@ public ActionForward execute(ActionMapping mapping,
RhnListSetHelper helper = new RhnListSetHelper(request);
RhnSet set = getSetDecl(currentChan).get(user);

DataResult<ErrataOverview> dr = getData(request, selectedChannel, currentChan, channelList, checked, user);
DataResult<ErrataOverview> dr = getData(request, selectedChannel, currentChan, channelList, checked,
listAlreadyIncludedPatches, user);

request.setAttribute(RequestContext.PAGE_LIST, dr);

Expand Down Expand Up @@ -244,6 +251,7 @@ private DataResult<ErrataOverview> getData(HttpServletRequest request,
Channel currentChan,
List<SelectableChannel> selChannelList,
boolean packageAssoc,
boolean listAlreadyIncludedPatches,
User user) {

if (selectedChan != null) {
Expand All @@ -252,7 +260,7 @@ private DataResult<ErrataOverview> getData(HttpServletRequest request,
set.addElement(selectedChan.getId());
RhnSetManager.store(set);
return ChannelManager.findErrataFromRhnSetForTarget(currentChan,
packageAssoc, user);
packageAssoc, listAlreadyIncludedPatches, user);
}
else if (selChannelList != null) {
RhnSet set = RhnSetDecl.CHANNELS_FOR_ERRATA.get(user);
Expand All @@ -262,7 +270,7 @@ else if (selChannelList != null) {
}
RhnSetManager.store(set);
return ChannelManager.findErrataFromRhnSetForTarget(currentChan,
packageAssoc, user);
packageAssoc, listAlreadyIncludedPatches, user);

}
else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22447,6 +22447,9 @@ As a Channel Administrator, you may change the base channels your systems are su
<trans-unit id="channel.manage.errata.packageassocmsg" xml:space="preserve">
<source>&lt;em&gt;(Recommended)&lt;/em&gt; With this selected only patches that contain packages that apply to this channel are shown. Also, package architecture will match what is currently in the channel.</source>
</trans-unit>
<trans-unit id="channel.manage.errata.listalreadyincludedmsg" xml:space="preserve">
<source>With this selected, patches that are already part of the channel are shown. This is useful when a patch is part of multiple channels, has been included from one of them, and it is necessary to associate its packages from another one.</source>
</trans-unit>
<trans-unit id="toolbar.ssm.add" xml:space="preserve">
<source>Add to SSM</source>
</trans-unit>
Expand Down
16 changes: 8 additions & 8 deletions java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -2064,15 +2064,9 @@ public static DataResult<ErrataOverview> findErrataForTarget(
* @return List of Errata
*/
public static DataResult<ErrataOverview> findErrataFromRhnSetForTarget(
Channel targetChannel, boolean packageAssoc, User user) {
Channel targetChannel, boolean packageAssoc, boolean listAlreadyIncluded, User user) {

String mode;
if (packageAssoc) {
mode = "in_sources_for_target_package_assoc";
}
else {
mode = "in_sources_for_target";
}
String mode = getModeFindErrataFromRhnSet(packageAssoc, listAlreadyIncluded);

Map<String, Long> params = new HashMap<>();
params.put("custom_cid", targetChannel.getId());
Expand All @@ -2085,6 +2079,12 @@ public static DataResult<ErrataOverview> findErrataFromRhnSetForTarget(
return m.execute(params);
}

private static String getModeFindErrataFromRhnSet(boolean packageAssoc, boolean listAlreadyIncluded) {
return "in_sources_for_target"
+ (packageAssoc ? "_package_assoc" : "")
+ (listAlreadyIncluded ? "_with_already_included" : "");
}

/**
* find available errata from custom base channels and their child channels for a
* particular channel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@
</div>
</div>

<div class="form-group">
<label class="col-lg-3 control-label">List Already Included Patches:</label>
<div class="col-lg-6">
<input type="checkbox" name="list_already_included" ${list_already_included ? 'checked' : ''}/>
<bean:message key="channel.manage.errata.listalreadyincludedmsg"/>
</div>
</div>

<c:if test="${selected_channel != null}">
<rhn:hidden name="selected_channel_old" value="${selected_channel}"/>
</c:if>
Expand Down
1 change: 1 addition & 0 deletions java/spacewalk-java.changes.welder.bsc1228856
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Allow the listing of already included patches when importing them into a custom channel (bsc#1228856)

0 comments on commit 2ec6c55

Please sign in to comment.