Finish up user and social media conversions.
This commit is contained in:
parent
d7e4c1c533
commit
c51b1e2dab
|
@ -124,17 +124,22 @@ class SocialMediaSchema(ma.Schema):
|
|||
model = SocialMedia
|
||||
# Fields to expose
|
||||
fields = (
|
||||
"url",
|
||||
"service",
|
||||
"username",
|
||||
)
|
||||
|
||||
url = ma.Method("get_url")
|
||||
service = ma.Method("get_service")
|
||||
username = ma.Method("get_username")
|
||||
|
||||
def get_url(self, obj):
|
||||
return obj.social_media_link
|
||||
|
||||
def get_service(self, obj):
|
||||
info = get_social_info_from_url(obj.social_media_link)
|
||||
return info['service']
|
||||
|
||||
|
||||
def get_username(self, obj):
|
||||
info = get_social_info_from_url(obj.social_media_link)
|
||||
return info['username']
|
||||
|
|
|
@ -39,13 +39,9 @@ def get_me():
|
|||
@blueprint.route("/<user_identity>", methods=["GET"])
|
||||
@endpoint.api()
|
||||
def get_user(user_identity):
|
||||
print('get by ident')
|
||||
user = User.get_by_identifier(email_address=user_identity, account_address=user_identity)
|
||||
print(user)
|
||||
if user:
|
||||
print('dumping')
|
||||
result = user_schema.dump(user)
|
||||
print(result)
|
||||
return result
|
||||
else:
|
||||
message = "User with account_address or user_identity matching {} not found".format(user_identity)
|
||||
|
|
|
@ -15,5 +15,5 @@ def get_social_info_from_url(url: str):
|
|||
if match:
|
||||
return {
|
||||
'service': service,
|
||||
'username': match.group(1),
|
||||
'username': match.group(1)
|
||||
}
|
||||
|
|
|
@ -44,7 +44,9 @@ class TestAPI(BaseUserConfig):
|
|||
|
||||
users_json = users_get_resp.json
|
||||
self.assertEqual(users_json["avatar"]["imageUrl"], self.user.avatar.image_url)
|
||||
self.assertEqual(users_json["socialMedias"][0]["socialMediaLink"], self.user.social_medias[0].social_media_link)
|
||||
self.assertEqual(users_json["socialMedias"][0]["service"], 'GITHUB')
|
||||
self.assertEqual(users_json["socialMedias"][0]["username"], 'groot')
|
||||
self.assertEqual(users_json["socialMedias"][0]["link"], self.user.social_medias[0].social_media_link)
|
||||
self.assertEqual(users_json["displayName"], self.user.display_name)
|
||||
|
||||
def test_get_single_user_by_account_address(self):
|
||||
|
@ -54,7 +56,9 @@ class TestAPI(BaseUserConfig):
|
|||
|
||||
users_json = users_get_resp.json
|
||||
self.assertEqual(users_json["avatar"]["imageUrl"], self.user.avatar.image_url)
|
||||
self.assertEqual(users_json["socialMedias"][0]["socialMediaLink"], self.user.social_medias[0].social_media_link)
|
||||
self.assertEqual(users_json["socialMedias"][0]["service"], 'GITHUB')
|
||||
self.assertEqual(users_json["socialMedias"][0]["username"], 'groot')
|
||||
self.assertEqual(users_json["socialMedias"][0]["link"], self.user.social_medias[0].social_media_link)
|
||||
self.assertEqual(users_json["displayName"], self.user.display_name)
|
||||
|
||||
def test_create_user_duplicate_400(self):
|
||||
|
|
|
@ -1565,8 +1565,14 @@
|
|||
"links": {},
|
||||
"address": "0x23de420265da56889af074254dd900bc888efbf6",
|
||||
"transactionHash": "0xa0259d1a6924f52fb52017ad410a860083749e4d444a29f02ed70309b831a123"
|
||||
},
|
||||
"1542657525387": {
|
||||
"events": {},
|
||||
"links": {},
|
||||
"address": "0x355f1ceac11b3b41641657c24258f74cdd7a1f4b",
|
||||
"transactionHash": "0xa0259d1a6924f52fb52017ad410a860083749e4d444a29f02ed70309b831a123"
|
||||
}
|
||||
},
|
||||
"schemaVersion": "2.0.1",
|
||||
"updatedAt": "2018-11-16T20:37:00.160Z"
|
||||
"updatedAt": "2018-11-19T19:59:35.976Z"
|
||||
}
|
|
@ -28,13 +28,13 @@ describe("create proposal", () => {
|
|||
{
|
||||
name: "Alisha Endtoend",
|
||||
title: "QA Robot0",
|
||||
ethAddress: `0x0000${randomEthHex}0000`,
|
||||
accountAddress: `0x0000${randomEthHex}0000`,
|
||||
emailAddress: `qa.alisha.${id}@grant.io`
|
||||
},
|
||||
{
|
||||
name: "Billy Endtoend",
|
||||
title: "QA Robot1",
|
||||
ethAddress: `0x1111${randomEthHex}1111`,
|
||||
accountAddress: `0x1111${randomEthHex}1111`,
|
||||
emailAddress: `qa.billy.${id}@grant.io`
|
||||
}
|
||||
],
|
||||
|
@ -79,7 +79,7 @@ describe("create proposal", () => {
|
|||
cy.get('.TeamMember-info input[name="name"]').type(proposal.team[0].name);
|
||||
cy.get('.TeamMember-info input[name="title"]').type(proposal.team[0].title);
|
||||
cy.get("@EthAccounts").then(accts => {
|
||||
cy.get('.TeamMember-info input[name="ethAddress"]').type(
|
||||
cy.get('.TeamMember-info input[name="accountAddress"]').type(
|
||||
accts[0].toString()
|
||||
);
|
||||
});
|
||||
|
@ -94,7 +94,7 @@ describe("create proposal", () => {
|
|||
cy.get('.TeamMember-info input[name="name"]').type(proposal.team[1].name);
|
||||
cy.get('.TeamMember-info input[name="title"]').type(proposal.team[1].title);
|
||||
cy.get("@EthAccounts").then(accts => {
|
||||
cy.get('.TeamMember-info input[name="ethAddress"]').type(
|
||||
cy.get('.TeamMember-info input[name="accountAddress"]').type(
|
||||
accts[1].toString()
|
||||
);
|
||||
});
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import React from 'react';
|
||||
import lodash from 'lodash';
|
||||
import { Input, Form, Col, Row, Button, Icon, Alert } from 'antd';
|
||||
import { SOCIAL_INFO } from 'utils/social';
|
||||
import { SOCIAL_INFO, socialMediaToUrl } from 'utils/social';
|
||||
import { SOCIAL_SERVICE, User } from 'types';
|
||||
import { UserState } from 'modules/users/reducers';
|
||||
import { getCreateTeamMemberError } from 'modules/create/utils';
|
||||
|
@ -224,6 +224,7 @@ export default class ProfileEdit extends React.PureComponent<Props, State> {
|
|||
socialMedias.push({
|
||||
service,
|
||||
username: value,
|
||||
url: socialMediaToUrl(service, value),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -245,7 +246,7 @@ export default class ProfileEdit extends React.PureComponent<Props, State> {
|
|||
const fields = {
|
||||
...this.state.fields,
|
||||
avatar: {
|
||||
image_url: `https://randomuser.me/api/portraits/${gender}/${num}.jpg`,
|
||||
imageUrl: `https://randomuser.me/api/portraits/${gender}/${num}.jpg`,
|
||||
},
|
||||
};
|
||||
const isChanged = this.isChangedCheck(fields);
|
||||
|
|
|
@ -6,7 +6,7 @@ import { usersActions } from 'modules/users';
|
|||
import { UserState } from 'modules/users/reducers';
|
||||
import ProfileEdit from './ProfileEdit';
|
||||
import UserAvatar from 'components/UserAvatar';
|
||||
import { SOCIAL_INFO, socialMediaToUrl } from 'utils/social';
|
||||
import { SOCIAL_INFO } from 'utils/social';
|
||||
import ShortAddress from 'components/ShortAddress';
|
||||
import './ProfileUser.less';
|
||||
import { AppState } from 'store/reducers';
|
||||
|
@ -97,7 +97,7 @@ class ProfileUser extends React.Component<Props> {
|
|||
|
||||
const Social = ({ socialMedia }: { socialMedia: SocialMedia }) => {
|
||||
return (
|
||||
<a href={socialMediaToUrl(socialMedia)} target="_blank" rel="noopener nofollow">
|
||||
<a href={socialMedia.url} target="_blank" rel="noopener nofollow">
|
||||
<div className="ProfileUser-info-social-icon">
|
||||
{SOCIAL_INFO[socialMedia.service].icon}
|
||||
</div>
|
||||
|
|
|
@ -80,7 +80,7 @@ class Profile extends React.Component<Props> {
|
|||
<HeaderDetails
|
||||
title={`${user.displayName} is funding projects on Grant.io`}
|
||||
description={`Join ${user.displayName} in funding the future!`}
|
||||
image={user.avatar ? user.avatar.image_url : undefined}
|
||||
image={user.avatar ? user.avatar.imageUrl : undefined}
|
||||
/>
|
||||
<ProfileUser user={user} />
|
||||
<Tabs>
|
||||
|
|
|
@ -9,8 +9,8 @@ interface Props {
|
|||
}
|
||||
|
||||
const UserAvatar: React.SFC<Props> = ({ user, className }) => {
|
||||
if (user.avatar && user.avatar.image_url) {
|
||||
return <img className={className} src={user.avatar.image_url} />;
|
||||
if (user.avatar && user.avatar.imageUrl) {
|
||||
return <img className={className} src={user.avatar.imageUrl} />;
|
||||
} else if (user.accountAddress) {
|
||||
return <Identicon className={className} address={user.accountAddress} />;
|
||||
} else {
|
||||
|
|
|
@ -4,8 +4,8 @@ import { socialMediaToUrl } from 'utils/social';
|
|||
export function formatUserForPost(user: User) {
|
||||
return {
|
||||
...user,
|
||||
avatar: user.avatar ? user.avatar.image_url : null,
|
||||
socialMedias: user.socialMedias.map(socialMediaToUrl),
|
||||
avatar: user.avatar ? user.avatar.imageUrl : null,
|
||||
socialMedias: user.socialMedias.map(sm => socialMediaToUrl(sm.service, sm.username)),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import React from 'react';
|
||||
import { Icon } from 'antd';
|
||||
import keybaseIcon from 'static/images/keybase.svg';
|
||||
import { SOCIAL_SERVICE, SocialMedia, SocialInfo } from 'types';
|
||||
import { SOCIAL_SERVICE, SocialInfo } from 'types';
|
||||
|
||||
const accountNameRegex = '([a-zA-Z0-9-_]*)';
|
||||
export const SOCIAL_INFO: { [key in SOCIAL_SERVICE]: SocialInfo } = {
|
||||
|
@ -31,6 +31,6 @@ export const SOCIAL_INFO: { [key in SOCIAL_SERVICE]: SocialInfo } = {
|
|||
},
|
||||
};
|
||||
|
||||
export function socialMediaToUrl(sm: SocialMedia): string {
|
||||
return SOCIAL_INFO[sm.service].format.replace(accountNameRegex, sm.username);
|
||||
export function socialMediaToUrl(service: SOCIAL_SERVICE, username: string): string {
|
||||
return SOCIAL_INFO[service].format.replace(accountNameRegex, username);
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ const user: User = {
|
|||
displayName: 'Dana Hayes',
|
||||
title: 'QA Engineer',
|
||||
avatar: {
|
||||
image_url: 'https://randomuser.me/api/portraits/women/19.jpg',
|
||||
imageUrl: 'https://randomuser.me/api/portraits/women/19.jpg',
|
||||
},
|
||||
accountAddress: DONATION.ETH,
|
||||
emailAddress: 'test@test.test',
|
||||
|
|
|
@ -3,6 +3,7 @@ import React from 'react';
|
|||
export type SocialAccountMap = Partial<{ [key in SOCIAL_SERVICE]: string }>;
|
||||
|
||||
export interface SocialMedia {
|
||||
url: string;
|
||||
service: SOCIAL_SERVICE;
|
||||
username: string;
|
||||
}
|
||||
|
|
|
@ -7,5 +7,5 @@ export interface User {
|
|||
displayName: string;
|
||||
title: string;
|
||||
socialMedias: SocialMedia[];
|
||||
avatar: { image_url: string } | null;
|
||||
avatar: { imageUrl: string } | null;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue