diff --git a/ChangeLog b/ChangeLog index eaafa85e..e4e38df4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -24642,3 +24642,6 @@ * Fixed a regression in rdlogmanager(1) that caused clock titles to fail to be centered in the pie wedge display in the 'Edit Clock' dialog. +2024-02-07 Fred Gleason + * Added the option to provision users from an existing RSS feed + to the 'Add RSS Feed' dialog in rdadmin(1). diff --git a/rdadmin/add_feed.cpp b/rdadmin/add_feed.cpp index 823cff77..d3c44a70 100644 --- a/rdadmin/add_feed.cpp +++ b/rdadmin/add_feed.cpp @@ -2,7 +2,7 @@ // // Add a Rivendell RSS Feed // -// (C) Copyright 2002-2021 Fred Gleason +// (C) Copyright 2002-2024 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -29,17 +29,19 @@ #include "edit_feed.h" #include "globals.h" -AddFeed::AddFeed(unsigned *id,QString *keyname,QWidget *parent) +AddFeed::AddFeed(unsigned *id,QString *keyname,QStringList *usernames, + QWidget *parent) : RDDialog(parent) { feed_keyname=keyname; feed_id=id; + feed_usernames=usernames; // // Fix the Window Size // setMinimumSize(sizeHint()); - setMaximumSize(sizeHint()); + setMaximumHeight(sizeHint().height()); setWindowTitle("RDADmin - "+tr("Add RSS Feed")); @@ -62,13 +64,33 @@ AddFeed::AddFeed(unsigned *id,QString *keyname,QWidget *parent) feed_keyname_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); // - // Enable Users Checkbox + // Enable User Selector // - feed_users_box=new QCheckBox(this); - feed_users_box->setChecked(true); - feed_users_label= - new QLabel(tr("Enable Feed for All Users"),this); - feed_users_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter); + feed_usernames_groupbox=new QGroupBox(tr("Enable Users For Feed"),this); + + feed_usernames_group=new QButtonGroup(this); + connect(feed_usernames_group,SIGNAL(buttonToggled(QAbstractButton *,bool)), + this,SLOT(buttonToggledData(QAbstractButton *,bool))); + + feed_none_radio= + new QRadioButton(tr("No Users"),this); + feed_usernames_group->addButton(feed_none_radio); + + feed_all_radio= + new QRadioButton(tr("All Users"),this); + feed_usernames_group->addButton(feed_all_radio); + + feed_some_radio= + new QRadioButton(tr("Users from Feed")+":",this); + feed_usernames_group->addButton(feed_some_radio); + feed_keyname_box=new QComboBox(this); + feed_keyname_model=new RDFeedListModel(true,false,this); + feed_keyname_model->setPalette(palette()); + feed_keyname_model->setFont(font()); + feed_keyname_box->setModel(feed_keyname_model); + feed_some_radio->setDisabled(feed_keyname_model->rowCount()==0); + feed_none_radio->setChecked(true); + buttonToggledData(feed_usernames_group->checkedButton(),true); // // Ok Button @@ -98,7 +120,7 @@ AddFeed::~AddFeed() QSize AddFeed::sizeHint() const { - return QSize(290,123); + return QSize(310,205); } @@ -114,14 +136,43 @@ void AddFeed::keynameChangedData(const QString &str) } +void AddFeed::buttonToggledData(QAbstractButton *rbutton,bool checked) +{ + feed_keyname_box->setEnabled((rbutton==feed_some_radio)&&checked); +} + + void AddFeed::okData() { QString err_msg; + QString sql; + RDSqlQuery *q=NULL; - *feed_id=RDFeed::create(feed_keyname_edit->text(),feed_users_box->isChecked(), - &err_msg); + *feed_id=RDFeed::create(feed_keyname_edit->text(),false,&err_msg); if(*feed_id!=0) { *feed_keyname=feed_keyname_edit->text(); + if(feed_usernames_group->checkedButton()==feed_all_radio) { + sql=QString("select ")+ + "`LOGIN_NAME` "+ // 00 + "from `USERS` where "+ + "(`ADMIN_CONFIG_PRIV`='N')&&(ADMIN_RSS_PRIV='N')"; + q=new RDSqlQuery(sql); + while(q->next()) { + AuthorizeUser(*feed_keyname,q->value(0).toString()); + } + delete q; + } + if(feed_usernames_group->checkedButton()==feed_some_radio) { + sql=QString("select ")+ + "`USER_NAME` "+ // 00 + "from `FEED_PERMS` where "+ + "`KEY_NAME`='"+RDEscapeString(feed_keyname_box->currentText())+"'"; + q=new RDSqlQuery(sql); + while(q->next()) { + AuthorizeUser(*feed_keyname,q->value(0).toString()); + } + delete q; + } done(true); } else { @@ -139,11 +190,24 @@ void AddFeed::cancelData() void AddFeed::resizeEvent(QResizeEvent *e) { feed_keyname_label->setGeometry(10,11,120,19); - feed_keyname_edit->setGeometry(135,11,sizeHint().width()-140,19); - - feed_users_box->setGeometry(40,35,15,15); - feed_users_label->setGeometry(60,33,sizeHint().width()-60,19); + feed_keyname_edit->setGeometry(135,11,sizeHint().width()-145,19); + feed_usernames_groupbox->setGeometry(10,35,size().width()-20,97); + feed_none_radio->setGeometry(30,45,160,30); + feed_all_radio->setGeometry(30,70,160,30); + feed_some_radio->setGeometry(30,95,160,30); + feed_keyname_box->setGeometry(150,95,size().width()-170,30); + feed_ok_button->setGeometry(size().width()-180,size().height()-60,80,50); feed_cancel_button->setGeometry(size().width()-90,size().height()-60,80,50); } + + +void AddFeed::AuthorizeUser(const QString &keyname, + const QString &login_name) const +{ + QString sql=QString("insert into `FEED_PERMS` set ")+ + "`KEY_NAME`='"+RDEscapeString(keyname)+"',"+ + "`USER_NAME`='"+RDEscapeString(login_name)+"'"; + RDSqlQuery::apply(sql); +} diff --git a/rdadmin/add_feed.h b/rdadmin/add_feed.h index 01982546..62bf0685 100644 --- a/rdadmin/add_feed.h +++ b/rdadmin/add_feed.h @@ -2,7 +2,7 @@ // // Add a Rivendell Feed // -// (C) Copyright 2002-2020 Fred Gleason +// (C) Copyright 2002-2024 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -21,40 +21,53 @@ #ifndef ADD_FEED_H #define ADD_FEED_H -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include class AddFeed : public RDDialog { Q_OBJECT public: - AddFeed(unsigned *id,QString *keyname,QWidget *parent=0); + AddFeed(unsigned *id,QString *keyname,QStringList *usernames,QWidget *parent); ~AddFeed(); QSize sizeHint() const; QSizePolicy sizePolicy() const; private slots: void keynameChangedData(const QString &str); + void buttonToggledData(QAbstractButton *rbutton,bool checked); void okData(); void cancelData(); protected: void resizeEvent(QResizeEvent *e); - private: - QLabel *feed_keyname_label; - QLineEdit *feed_keyname_edit; - QCheckBox *feed_users_box; - QLabel *feed_users_label; - QPushButton *feed_ok_button; - QPushButton *feed_cancel_button; - QString *feed_keyname; - unsigned *feed_id; + private: + void AuthorizeUser(const QString &keyname,const QString &login_name) const; + QLabel *feed_keyname_label; + QLineEdit *feed_keyname_edit; + QGroupBox *feed_usernames_groupbox; + QButtonGroup *feed_usernames_group; + QRadioButton *feed_none_radio; + QRadioButton *feed_all_radio; + QRadioButton *feed_some_radio; + QComboBox *feed_keyname_box; + RDFeedListModel *feed_keyname_model; + QPushButton *feed_ok_button; + QPushButton *feed_cancel_button; + QString *feed_keyname; + unsigned *feed_id; + QStringList *feed_usernames; }; diff --git a/rdadmin/list_feeds.cpp b/rdadmin/list_feeds.cpp index d8c613fe..a79107d5 100644 --- a/rdadmin/list_feeds.cpp +++ b/rdadmin/list_feeds.cpp @@ -2,7 +2,7 @@ // // List Rivendell Feeds // -// (C) Copyright 2002-2023 Fred Gleason +// (C) Copyright 2002-2024 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -144,9 +144,10 @@ void ListFeeds::addData() { QString feed; unsigned id; + QStringList usernames; QString sql; - AddFeed *ad=new AddFeed(&id,&feed,this); + AddFeed *ad=new AddFeed(&id,&feed,&usernames,this); if(ad->exec()) { EditFeed *d=new EditFeed(feed,this); if(d->exec()) { @@ -168,8 +169,6 @@ void ListFeeds::addData() sql=QString("delete from `FEEDS` where ")+ "`KEY_NAME`='"+RDEscapeString(feed)+"'"; RDSqlQuery::apply(sql); - - return; } delete d; }