File indexing completed on 2024-04-14 15:32:44

0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com>
0003 // SPDX-FileCopyrightText: 2019-2021 Harald Sitter <sitter@kde.org>
0004 
0005 #include "duplicatemodel.h"
0006 
0007 #include <QMetaEnum>
0008 
0009 #include "bugzillaintegration/bugzillalib.h"
0010 #include "bugzillaintegration/reportinterface.h"
0011 
0012 void DuplicateModel::setManager(BugzillaManager *manager)
0013 {
0014     if (m_manager) {
0015         m_manager->disconnect(this);
0016     }
0017     m_manager = manager;
0018 
0019     connect(m_manager, &BugzillaManager::searchFinished, this, &DuplicateModel::searchFinished);
0020     connect(m_manager, &BugzillaManager::searchError, this, [] {
0021         qDebug() << "search error";
0022     });
0023 
0024     Q_EMIT managerChanged();
0025 }
0026 
0027 void DuplicateModel::searchBugs(const QStringList &products, const QString &severity, const QString &comment)
0028 {
0029     m_searching = true;
0030     Q_EMIT searchingChanged();
0031     m_manager->searchBugs(products, severity, comment, m_offset);
0032 }
0033 
0034 int DuplicateModel::rowCount(const QModelIndex &parent) const
0035 {
0036     Q_UNUSED(parent)
0037     return m_list.size();
0038 }
0039 
0040 QVariant DuplicateModel::data(const QModelIndex &index, int intRole) const
0041 {
0042     if (!index.isValid()) {
0043         return {};
0044     }
0045 
0046     auto bug = m_list.at(index.row());
0047     switch (static_cast<Role>(intRole)) {
0048     case Role::Title:
0049         return bug->summary();
0050     case Role::Number:
0051         return bug->id();
0052     case Role::Object:
0053         return QVariant::fromValue(bug.data());
0054     }
0055 
0056     return {};
0057 }
0058 
0059 QHash<int, QByteArray> DuplicateModel::roleNames() const
0060 {
0061     static QHash<int, QByteArray> roles;
0062     if (!roles.isEmpty()) {
0063         return roles;
0064     }
0065 
0066     const QMetaEnum roleEnum = QMetaEnum::fromType<Role>();
0067     for (int i = 0; i < roleEnum.keyCount(); ++i) {
0068         const int value = roleEnum.value(i);
0069         Q_ASSERT(value != -1);
0070         roles[static_cast<int>(value)] = QByteArray("ROLE_") + roleEnum.valueToKey(value);
0071     }
0072     return roles;
0073 }
0074 
0075 void DuplicateModel::searchFinished(const QList<Bugzilla::Bug::Ptr> &list)
0076 {
0077     int results = list.count();
0078 
0079     qDebug() << "search finished" << results;
0080     m_offset += results;
0081     if (results > 0) {
0082         m_atEnd = false;
0083         Q_EMIT atEndChanged();
0084         beginResetModel();
0085         for (int i = 0; i < results; ++i) {
0086             const Bugzilla::Bug::Ptr &bug = list.at(i);
0087             m_list.append(bug);
0088         }
0089         endResetModel();
0090 
0091         if (!m_foundDuplicate) {
0092             m_searching = true;
0093             Q_EMIT searchingChanged();
0094             auto *job = new DuplicateFinderJob(list, m_manager, this);
0095             connect(job, &KJob::result, this, &DuplicateModel::analyzedDuplicates);
0096             job->start();
0097         }
0098     } else {
0099         m_atEnd = true;
0100         Q_EMIT atEndChanged();
0101         m_searching = false;
0102         Q_EMIT searchingChanged();
0103     }
0104 }
0105 
0106 void DuplicateModel::analyzedDuplicates(KJob *j)
0107 {
0108     qDebug() << "ANALYZE";
0109 
0110     auto *job = static_cast<DuplicateFinderJob *>(j);
0111     m_result = job->result();
0112     m_foundDuplicate = m_result.parentDuplicate;
0113     qDebug() << m_result.parentDuplicate << m_foundDuplicate;
0114     m_reportInterface->setDuplicateId(m_result.parentDuplicate);
0115 
0116     m_searching = false;
0117     Q_EMIT searchingChanged();
0118 }