Compare commits
2 Commits
feature-do
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 9dce750ee5 | |||
| 2ffa1d9438 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,3 +1,7 @@
|
|||||||
.vscode
|
.vscode
|
||||||
.mypy_cache
|
.mypy_cache
|
||||||
docker-stack.yml
|
docker-stack.yml
|
||||||
|
backend/pyvenv.cfg
|
||||||
|
backend/Include/
|
||||||
|
backend/Scripts/
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,35 @@ from app.core.apiexception import APIException
|
|||||||
|
|
||||||
platform_router = r = APIRouter()
|
platform_router = r = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
@r.get(
|
||||||
|
"/apps",
|
||||||
|
response_model=List[AppList],
|
||||||
|
response_model_exclude_none=True,
|
||||||
|
)
|
||||||
|
async def apps_list(
|
||||||
|
request: Request,
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
try:
|
||||||
|
app = get_apps(db)
|
||||||
|
return app
|
||||||
|
except Exception as e:
|
||||||
|
raise APIException('platform:apps',request.url._url,f"Error occurred while get apps:",e)
|
||||||
|
|
||||||
|
@r.post("/apps", response_model=AppList, response_model_exclude_none=True)
|
||||||
|
async def apps_update(
|
||||||
|
request: Request,
|
||||||
|
app: AppVersion,
|
||||||
|
user=Depends(get_current_user),
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
try:
|
||||||
|
return update_appversion(db, app,user.id)
|
||||||
|
except Exception as e:
|
||||||
|
raise APIException('platform:apps',request.url._url,f"Error occurred while get create app :",e)
|
||||||
|
|
||||||
|
|
||||||
@r.get(
|
@r.get(
|
||||||
"/appsettings/{id}",
|
"/appsettings/{id}",
|
||||||
response_model=App,
|
response_model=App,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import base64
|
|||||||
PROJECT_NAME = "KintoneAppBuilder"
|
PROJECT_NAME = "KintoneAppBuilder"
|
||||||
|
|
||||||
#SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/dev"
|
#SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/dev"
|
||||||
SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres"
|
SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://kabAdmin:P%40ssw0rd!@kintonetooldb.postgres.database.azure.com/postgres"
|
||||||
#SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/test"
|
#SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@kintonetooldb.postgres.database.azure.com/test"
|
||||||
#SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@ktune-prod-db.postgres.database.azure.com/postgres"
|
#SQLALCHEMY_DATABASE_URI = "postgres://kabAdmin:P@ssw0rd!@ktune-prod-db.postgres.database.azure.com/postgres"
|
||||||
API_V1_STR = "/k/v1"
|
API_V1_STR = "/k/v1"
|
||||||
|
|||||||
@@ -69,6 +69,29 @@ def edit_user(
|
|||||||
db.refresh(db_user)
|
db.refresh(db_user)
|
||||||
return db_user
|
return db_user
|
||||||
|
|
||||||
|
def get_apps(
|
||||||
|
db: Session
|
||||||
|
) -> t.List[schemas.AppList]:
|
||||||
|
return db.query(models.App).all()
|
||||||
|
|
||||||
|
def update_appversion(db: Session, appedit: schemas.AppVersion,userid:int):
|
||||||
|
app = db.query(models.App).filter(and_(models.App.domainurl == appedit.domainurl,models.App.appid == appedit.appid)).first()
|
||||||
|
if app:
|
||||||
|
app.version = app.version + 1
|
||||||
|
db_app = app
|
||||||
|
else:
|
||||||
|
db_app = models.App(
|
||||||
|
domainurl = appedit.domainurl,
|
||||||
|
appid=appedit.appid,
|
||||||
|
appname=appedit.appname,
|
||||||
|
version = 1,
|
||||||
|
updateuser= userid
|
||||||
|
)
|
||||||
|
|
||||||
|
db.add(db_app)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(db_app)
|
||||||
|
return db_app
|
||||||
|
|
||||||
def get_appsetting(db: Session, id: int):
|
def get_appsetting(db: Session, id: int):
|
||||||
app = db.query(models.AppSetting).get(id)
|
app = db.query(models.AppSetting).get(id)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from sqlalchemy import Boolean, Column, Integer, String, DateTime,ForeignKey
|
from sqlalchemy import Boolean, Column, Integer, String, DateTime,ForeignKey
|
||||||
from sqlalchemy.ext.declarative import as_declarative
|
from sqlalchemy.ext.declarative import as_declarative
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from app.core.security import chacha20Decrypt
|
from app.core.security import chacha20Decrypt
|
||||||
@@ -20,6 +21,16 @@ class User(Base):
|
|||||||
is_active = Column(Boolean, default=True)
|
is_active = Column(Boolean, default=True)
|
||||||
is_superuser = Column(Boolean, default=False)
|
is_superuser = Column(Boolean, default=False)
|
||||||
|
|
||||||
|
class App(Base):
|
||||||
|
__tablename__ = "app"
|
||||||
|
|
||||||
|
domainurl = Column(String(200), nullable=False)
|
||||||
|
appname = Column(String(200), nullable=False)
|
||||||
|
appid = Column(String(100), index=True, nullable=False)
|
||||||
|
version = Column(Integer)
|
||||||
|
updateuser = Column(Integer,ForeignKey("user.id"))
|
||||||
|
user = relationship('User')
|
||||||
|
|
||||||
class AppSetting(Base):
|
class AppSetting(Base):
|
||||||
__tablename__ = "appsetting"
|
__tablename__ = "appsetting"
|
||||||
|
|
||||||
|
|||||||
@@ -28,21 +28,21 @@ class UserCreate(UserBase):
|
|||||||
is_active:bool
|
is_active:bool
|
||||||
is_superuser:bool
|
is_superuser:bool
|
||||||
|
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
|
|
||||||
class UserEdit(UserBase):
|
class UserEdit(UserBase):
|
||||||
password: t.Optional[str] = None
|
password: t.Optional[str] = None
|
||||||
|
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
|
|
||||||
class User(UserBase):
|
class User(UserBase):
|
||||||
id: int
|
id: int
|
||||||
|
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
|
|
||||||
@@ -50,6 +50,17 @@ class Token(BaseModel):
|
|||||||
access_token: str
|
access_token: str
|
||||||
token_type: str
|
token_type: str
|
||||||
|
|
||||||
|
class AppList(Base):
|
||||||
|
domainurl: str
|
||||||
|
appname: str
|
||||||
|
appid:str
|
||||||
|
version:int
|
||||||
|
user:UserOut
|
||||||
|
|
||||||
|
class AppVersion(BaseModel):
|
||||||
|
domainurl: str
|
||||||
|
appname: str
|
||||||
|
appid:str
|
||||||
|
|
||||||
class TokenData(BaseModel):
|
class TokenData(BaseModel):
|
||||||
id:int = 0
|
id:int = 0
|
||||||
@@ -68,7 +79,7 @@ class AppBase(BaseModel):
|
|||||||
class App(AppBase):
|
class App(AppBase):
|
||||||
id: int
|
id: int
|
||||||
|
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
|
|
||||||
@@ -79,7 +90,7 @@ class Kintone(BaseModel):
|
|||||||
desc: str = None
|
desc: str = None
|
||||||
content: str = None
|
content: str = None
|
||||||
|
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
class Action(BaseModel):
|
class Action(BaseModel):
|
||||||
@@ -92,7 +103,7 @@ class Action(BaseModel):
|
|||||||
categoryid: int = None
|
categoryid: int = None
|
||||||
nosort: int
|
nosort: int
|
||||||
categoryname : str =None
|
categoryname : str =None
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
class FlowBase(BaseModel):
|
class FlowBase(BaseModel):
|
||||||
@@ -111,7 +122,7 @@ class Flow(Base):
|
|||||||
name: str = None
|
name: str = None
|
||||||
content: str = None
|
content: str = None
|
||||||
|
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
class DomainBase(BaseModel):
|
class DomainBase(BaseModel):
|
||||||
@@ -133,7 +144,7 @@ class Domain(Base):
|
|||||||
url: str
|
url: str
|
||||||
kintoneuser: str
|
kintoneuser: str
|
||||||
kintonepwd: str
|
kintonepwd: str
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
class Event(Base):
|
class Event(Base):
|
||||||
@@ -145,7 +156,7 @@ class Event(Base):
|
|||||||
mobile: bool
|
mobile: bool
|
||||||
eventgroup: bool
|
eventgroup: bool
|
||||||
|
|
||||||
class Config:
|
class ConfigDict:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
|
|
||||||
class ErrorCreate(BaseModel):
|
class ErrorCreate(BaseModel):
|
||||||
|
|||||||
Binary file not shown.
@@ -4,7 +4,6 @@
|
|||||||
tag="a"
|
tag="a"
|
||||||
:target="target?target:'_blank'"
|
:target="target?target:'_blank'"
|
||||||
:href="link"
|
:href="link"
|
||||||
:disable="disable"
|
|
||||||
v-if="!isSeparator"
|
v-if="!isSeparator"
|
||||||
>
|
>
|
||||||
<q-item-section
|
<q-item-section
|
||||||
@@ -34,7 +33,6 @@ export interface EssentialLinkProps {
|
|||||||
icon?: string;
|
icon?: string;
|
||||||
isSeparator?: boolean;
|
isSeparator?: boolean;
|
||||||
target?:string;
|
target?:string;
|
||||||
disable?:boolean;
|
|
||||||
}
|
}
|
||||||
withDefaults(defineProps<EssentialLinkProps>(), {
|
withDefaults(defineProps<EssentialLinkProps>(), {
|
||||||
caption: '',
|
caption: '',
|
||||||
|
|||||||
@@ -22,8 +22,6 @@
|
|||||||
<div v-if="isAdmin()">
|
<div v-if="isAdmin()">
|
||||||
<EssentialLink v-for="link in adminLinks" :key="link.title" v-bind="link" />
|
<EssentialLink v-for="link in adminLinks" :key="link.title" v-bind="link" />
|
||||||
</div>
|
</div>
|
||||||
<EssentialLink v-for="link in domainLinks" :key="link.title" v-bind="link" />
|
|
||||||
|
|
||||||
</q-list>
|
</q-list>
|
||||||
</q-drawer>
|
</q-drawer>
|
||||||
|
|
||||||
@@ -34,7 +32,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onMounted, computed } from 'vue';
|
import { onMounted } from 'vue';
|
||||||
import EssentialLink, { EssentialLinkProps } from 'components/EssentialLink.vue';
|
import EssentialLink, { EssentialLinkProps } from 'components/EssentialLink.vue';
|
||||||
import DomainSelector from 'components/DomainSelector.vue';
|
import DomainSelector from 'components/DomainSelector.vue';
|
||||||
import { useAuthStore } from 'stores/useAuthStore';
|
import { useAuthStore } from 'stores/useAuthStore';
|
||||||
@@ -47,16 +45,14 @@ const essentialLinks: EssentialLinkProps[] = [
|
|||||||
caption: '設計書から導入する',
|
caption: '設計書から導入する',
|
||||||
icon: 'home',
|
icon: 'home',
|
||||||
link: '/',
|
link: '/',
|
||||||
target: '_self',
|
target: '_self'
|
||||||
disable: !authStore.hasDomain,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'フローエディター',
|
title: 'フローエディター',
|
||||||
caption: 'イベントを設定する',
|
caption: 'イベントを設定する',
|
||||||
icon: 'account_tree',
|
icon: 'account_tree',
|
||||||
link: '/#/FlowChart',
|
link: '/#/FlowChart',
|
||||||
target: '_self',
|
target: '_self'
|
||||||
disable: !authStore.hasDomain,
|
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
// title: '条件エディター',
|
// title: '条件エディター',
|
||||||
@@ -87,23 +83,58 @@ const essentialLinks: EssentialLinkProps[] = [
|
|||||||
// link:'https://cybozu.dev/ja/kintone/docs/',
|
// link:'https://cybozu.dev/ja/kintone/docs/',
|
||||||
// icon:'help_outline'
|
// icon:'help_outline'
|
||||||
// },
|
// },
|
||||||
];
|
|
||||||
|
|
||||||
const domainLinks: EssentialLinkProps[] = [
|
|
||||||
{
|
|
||||||
title: 'ドメイン管理',
|
|
||||||
caption: 'kintoneのドメイン設定',
|
|
||||||
icon: 'domain',
|
|
||||||
link: '/#/domain',
|
|
||||||
target: '_self'
|
|
||||||
},
|
|
||||||
// {
|
// {
|
||||||
// title: 'ドメイン適用',
|
// title:'',
|
||||||
// caption: 'ユーザー使用可能なドメインの設定',
|
// isSeparator:true
|
||||||
// icon: 'assignment_ind',
|
|
||||||
// link: '/#/userDomain',
|
|
||||||
// target: '_self'
|
|
||||||
// },
|
// },
|
||||||
|
// {
|
||||||
|
// title: 'Docs',
|
||||||
|
// caption: 'quasar.dev',
|
||||||
|
// icon: 'school',
|
||||||
|
// link: 'https://quasar.dev'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// title: 'Icons',
|
||||||
|
// caption: 'Material Icons',
|
||||||
|
// icon: 'insert_emoticon',
|
||||||
|
// link: 'https://fonts.google.com/icons?selected=Material+Icons:insert_emoticon:'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// title: 'Github',
|
||||||
|
// caption: 'github.com/quasarframework',
|
||||||
|
// icon: 'code',
|
||||||
|
// link: 'https://github.com/quasarframework'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// title: 'Discord Chat Channel',
|
||||||
|
// caption: 'chat.quasar.dev',
|
||||||
|
// icon: 'chat',
|
||||||
|
// link: 'https://chat.quasar.dev'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// title: 'Forum',
|
||||||
|
// caption: 'forum.quasar.dev',
|
||||||
|
// icon: 'record_voice_over',
|
||||||
|
// link: 'https://forum.quasar.dev'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// title: 'Twitter',
|
||||||
|
// caption: '@quasarframework',
|
||||||
|
// icon: 'rss_feed',
|
||||||
|
// link: 'https://twitter.quasar.dev'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// title: 'Facebook',
|
||||||
|
// caption: '@QuasarFramework',
|
||||||
|
// icon: 'public',
|
||||||
|
// link: 'https://facebook.quasar.dev'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// title: 'Quasar Awesome',
|
||||||
|
// caption: 'Community Quasar projects',
|
||||||
|
// icon: 'favorite',
|
||||||
|
// link: 'https://awesome.quasar.dev'
|
||||||
|
// }
|
||||||
];
|
];
|
||||||
|
|
||||||
const adminLinks: EssentialLinkProps[] = [
|
const adminLinks: EssentialLinkProps[] = [
|
||||||
@@ -114,6 +145,20 @@ const adminLinks: EssentialLinkProps[] = [
|
|||||||
link: '/#/user',
|
link: '/#/user',
|
||||||
target: '_self'
|
target: '_self'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'ドメイン管理',
|
||||||
|
caption: 'kintoneのドメイン設定',
|
||||||
|
icon: 'domain',
|
||||||
|
link: '/#/domain',
|
||||||
|
target: '_self'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'ドメイン適用',
|
||||||
|
caption: 'ユーザー使用可能なドメインの設定',
|
||||||
|
icon: 'assignment_ind',
|
||||||
|
link: '/#/userDomain',
|
||||||
|
target: '_self'
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const version = process.env.version;
|
const version = process.env.version;
|
||||||
|
|||||||
@@ -47,13 +47,6 @@ export default route(function (/* { store, ssrContext } */) {
|
|||||||
authStore.returnUrl = to.fullPath;
|
authStore.returnUrl = to.fullPath;
|
||||||
return '/login';
|
return '/login';
|
||||||
}
|
}
|
||||||
|
|
||||||
// redirect to domain setting page if no domain exist
|
|
||||||
const domainPages = [...publicPages, '/domain'];
|
|
||||||
if (!authStore.hasDomain && !domainPages.includes(to.path)) {
|
|
||||||
authStore.returnUrl = to.fullPath;
|
|
||||||
return '/domain';
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
return routerInstance;
|
return routerInstance;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -33,9 +33,6 @@ export const useAuthStore = defineStore('auth', {
|
|||||||
toggleLeftDrawer(): boolean {
|
toggleLeftDrawer(): boolean {
|
||||||
return this.LeftDrawer;
|
return this.LeftDrawer;
|
||||||
},
|
},
|
||||||
hasDomain(): boolean {
|
|
||||||
return this.currentDomain.id === null;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
toggleLeftMenu() {
|
toggleLeftMenu() {
|
||||||
@@ -63,11 +60,11 @@ export const useAuthStore = defineStore('auth', {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
async getCurrentDomain(): Promise<IDomainInfo> {
|
async getCurrentDomain(): Promise<IDomainInfo> {
|
||||||
const activedomain = (await api.get(`api/activedomain`))?.data;
|
const activedomain = await api.get(`api/activedomain`);
|
||||||
return {
|
return {
|
||||||
id: activedomain?.id,
|
id: activedomain.data.id,
|
||||||
domainName: activedomain?.name,
|
domainName: activedomain.data.name,
|
||||||
kintoneUrl: activedomain?.url,
|
kintoneUrl: activedomain.data.url,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
async getUserDomains(): Promise<IDomainInfo[]> {
|
async getUserDomains(): Promise<IDomainInfo[]> {
|
||||||
|
|||||||
Reference in New Issue
Block a user